modAL 1.2.5.dev28__tar.gz → 1.2.6.dev0__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 (197) hide show
  1. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/PKG-INFO +1 -1
  2. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/client.pyi +2 -2
  3. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/PKG-INFO +1 -1
  4. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/task_command_router.proto +20 -0
  5. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/task_command_router_grpc.py +33 -0
  6. modal-1.2.6.dev0/modal_proto/task_command_router_pb2.py +180 -0
  7. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/task_command_router_pb2.pyi +51 -0
  8. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/task_command_router_pb2_grpc.py +69 -0
  9. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/task_command_router_pb2_grpc.pyi +25 -0
  10. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_version/__init__.py +1 -1
  11. modal-1.2.5.dev28/modal_proto/task_command_router_pb2.py +0 -149
  12. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/LICENSE +0 -0
  13. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/README.md +0 -0
  14. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/__init__.py +0 -0
  15. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/__main__.py +0 -0
  16. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_billing.py +0 -0
  17. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_clustered_functions.py +0 -0
  18. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_clustered_functions.pyi +0 -0
  19. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_container_entrypoint.py +0 -0
  20. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_functions.py +0 -0
  21. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_grpc_client.py +0 -0
  22. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_ipython.py +0 -0
  23. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_load_context.py +0 -0
  24. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_location.py +0 -0
  25. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_object.py +0 -0
  26. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_output.py +0 -0
  27. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_partial_function.py +0 -0
  28. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_pty.py +0 -0
  29. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_resolver.py +0 -0
  30. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_resources.py +0 -0
  31. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/__init__.py +0 -0
  32. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/asgi.py +0 -0
  33. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/container_io_manager.py +0 -0
  34. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/container_io_manager.pyi +0 -0
  35. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/execution_context.py +0 -0
  36. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/execution_context.pyi +0 -0
  37. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  38. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/telemetry.py +0 -0
  39. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/user_code_event_loop.py +0 -0
  40. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_runtime/user_code_imports.py +0 -0
  41. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_serialization.py +0 -0
  42. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_traceback.py +0 -0
  43. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_tunnel.py +0 -0
  44. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_tunnel.pyi +0 -0
  45. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_type_manager.py +0 -0
  46. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/__init__.py +0 -0
  47. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/app_utils.py +0 -0
  48. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/async_utils.py +0 -0
  49. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/auth_token_manager.py +0 -0
  50. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/blob_utils.py +0 -0
  51. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/bytes_io_segment_payload.py +0 -0
  52. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/deprecation.py +0 -0
  53. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/docker_utils.py +0 -0
  54. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/function_utils.py +0 -0
  55. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/git_utils.py +0 -0
  56. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/grpc_testing.py +0 -0
  57. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/grpc_utils.py +0 -0
  58. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/hash_utils.py +0 -0
  59. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/http_utils.py +0 -0
  60. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/jwt_utils.py +0 -0
  61. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/logger.py +0 -0
  62. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/mount_utils.py +0 -0
  63. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/name_utils.py +0 -0
  64. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/package_utils.py +0 -0
  65. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/pattern_utils.py +0 -0
  66. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/rand_pb_testing.py +0 -0
  67. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/shell_utils.py +0 -0
  68. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/task_command_router_client.py +0 -0
  69. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_utils/time_utils.py +0 -0
  70. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_vendor/__init__.py +0 -0
  71. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  72. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_vendor/cloudpickle.py +0 -0
  73. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_vendor/tblib.py +0 -0
  74. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/_watcher.py +0 -0
  75. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/app.py +0 -0
  76. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/app.pyi +0 -0
  77. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/billing.py +0 -0
  78. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/2023.12.312.txt +0 -0
  79. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/2023.12.txt +0 -0
  80. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/2024.04.txt +0 -0
  81. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/2024.10.txt +0 -0
  82. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/2025.06.txt +0 -0
  83. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/PREVIEW.txt +0 -0
  84. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/README.md +0 -0
  85. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/builder/base-images.json +0 -0
  86. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/call_graph.py +0 -0
  87. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/__init__.py +0 -0
  88. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/_download.py +0 -0
  89. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/_traceback.py +0 -0
  90. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/app.py +0 -0
  91. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/cluster.py +0 -0
  92. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/config.py +0 -0
  93. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/container.py +0 -0
  94. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/dict.py +0 -0
  95. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/entry_point.py +0 -0
  96. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/environment.py +0 -0
  97. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/import_refs.py +0 -0
  98. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/launch.py +0 -0
  99. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/network_file_system.py +0 -0
  100. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/profile.py +0 -0
  101. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/programs/__init__.py +0 -0
  102. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/programs/launch_instance_ssh.py +0 -0
  103. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/programs/run_jupyter.py +0 -0
  104. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/programs/run_marimo.py +0 -0
  105. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/programs/vscode.py +0 -0
  106. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/queues.py +0 -0
  107. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/run.py +0 -0
  108. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/secret.py +0 -0
  109. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/shell.py +0 -0
  110. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/token.py +0 -0
  111. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/utils.py +0 -0
  112. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cli/volume.py +0 -0
  113. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/client.py +0 -0
  114. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cloud_bucket_mount.py +0 -0
  115. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cloud_bucket_mount.pyi +0 -0
  116. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cls.py +0 -0
  117. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/cls.pyi +0 -0
  118. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/config.py +0 -0
  119. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/container_process.py +0 -0
  120. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/container_process.pyi +0 -0
  121. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/dict.py +0 -0
  122. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/dict.pyi +0 -0
  123. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/environments.py +0 -0
  124. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/environments.pyi +0 -0
  125. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/exception.py +0 -0
  126. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/experimental/__init__.py +0 -0
  127. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/experimental/flash.py +0 -0
  128. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/experimental/flash.pyi +0 -0
  129. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/experimental/ipython.py +0 -0
  130. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/file_io.py +0 -0
  131. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/file_io.pyi +0 -0
  132. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/file_pattern_matcher.py +0 -0
  133. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/functions.py +0 -0
  134. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/functions.pyi +0 -0
  135. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/gpu.py +0 -0
  136. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/image.py +0 -0
  137. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/image.pyi +0 -0
  138. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/io_streams.py +0 -0
  139. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/io_streams.pyi +0 -0
  140. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/mount.py +0 -0
  141. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/mount.pyi +0 -0
  142. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/network_file_system.py +0 -0
  143. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/network_file_system.pyi +0 -0
  144. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/object.py +0 -0
  145. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/object.pyi +0 -0
  146. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/output.py +0 -0
  147. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/parallel_map.py +0 -0
  148. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/parallel_map.pyi +0 -0
  149. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/partial_function.py +0 -0
  150. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/partial_function.pyi +0 -0
  151. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/proxy.py +0 -0
  152. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/proxy.pyi +0 -0
  153. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/py.typed +0 -0
  154. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/queue.py +0 -0
  155. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/queue.pyi +0 -0
  156. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/retries.py +0 -0
  157. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/runner.py +0 -0
  158. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/runner.pyi +0 -0
  159. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/running_app.py +0 -0
  160. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/sandbox.py +0 -0
  161. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/sandbox.pyi +0 -0
  162. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/schedule.py +0 -0
  163. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/scheduler_placement.py +0 -0
  164. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/secret.py +0 -0
  165. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/secret.pyi +0 -0
  166. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/serving.py +0 -0
  167. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/serving.pyi +0 -0
  168. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/snapshot.py +0 -0
  169. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/snapshot.pyi +0 -0
  170. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/stream_type.py +0 -0
  171. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/token_flow.py +0 -0
  172. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/token_flow.pyi +0 -0
  173. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/volume.py +0 -0
  174. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal/volume.pyi +0 -0
  175. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/SOURCES.txt +0 -0
  176. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/dependency_links.txt +0 -0
  177. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/entry_points.txt +0 -0
  178. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/requires.txt +0 -0
  179. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal.egg-info/top_level.txt +0 -0
  180. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/__init__.py +0 -0
  181. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/gen_cli_docs.py +0 -0
  182. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/gen_reference_docs.py +0 -0
  183. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/mdmd/__init__.py +0 -0
  184. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/mdmd/mdmd.py +0 -0
  185. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_docs/mdmd/signatures.py +0 -0
  186. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/__init__.py +0 -0
  187. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api.proto +0 -0
  188. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api_grpc.py +0 -0
  189. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api_pb2.py +0 -0
  190. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api_pb2.pyi +0 -0
  191. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api_pb2_grpc.py +0 -0
  192. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/api_pb2_grpc.pyi +0 -0
  193. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/modal_api_grpc.py +0 -0
  194. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_proto/py.typed +0 -0
  195. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/modal_version/__main__.py +0 -0
  196. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/pyproject.toml +0 -0
  197. {modal-1.2.5.dev28 → modal-1.2.6.dev0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev28
3
+ Version: 1.2.6.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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.dev28",
35
+ version: str = "1.2.6.dev0",
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.dev28",
166
+ version: str = "1.2.6.dev0",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev28
3
+ Version: 1.2.6.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -2,6 +2,7 @@ syntax = "proto3";
2
2
 
3
3
  option go_package = "github.com/modal-labs/modal/go/proto";
4
4
 
5
+ import "google/protobuf/empty.proto";
5
6
  import "modal_proto/api.proto";
6
7
 
7
8
  package modal.task_command_router;
@@ -130,6 +131,21 @@ message TaskExecWaitResponse {
130
131
  // and termination by Modal (due to task timeout, exec exceeded deadline, etc.)
131
132
  }
132
133
 
134
+ message TaskMountDirectoryRequest {
135
+ string task_id = 1;
136
+ bytes path = 2;
137
+ string image_id = 3;
138
+ }
139
+
140
+ message TaskSnapshotDirectoryRequest {
141
+ string task_id = 1;
142
+ bytes path = 2;
143
+ }
144
+
145
+ message TaskSnapshotDirectoryResponse {
146
+ string image_id = 1;
147
+ }
148
+
133
149
  service TaskCommandRouter {
134
150
  // Poll for the exit status of an exec'd command.
135
151
  rpc TaskExecPoll(TaskExecPollRequest) returns (TaskExecPollResponse);
@@ -141,4 +157,8 @@ service TaskCommandRouter {
141
157
  rpc TaskExecStdioRead(TaskExecStdioReadRequest) returns (stream TaskExecStdioReadResponse);
142
158
  // Wait for an exec'd command to exit and return the exit code.
143
159
  rpc TaskExecWait(TaskExecWaitRequest) returns (TaskExecWaitResponse);
160
+ // Mount an image at a directory in the container.
161
+ rpc TaskMountDirectory(TaskMountDirectoryRequest) returns (google.protobuf.Empty);
162
+ // Snapshot a directory with a mounted image, including any local changes, into a new image.
163
+ rpc TaskSnapshotDirectory(TaskSnapshotDirectoryRequest) returns (TaskSnapshotDirectoryResponse);
144
164
  }
@@ -9,6 +9,7 @@ import grpclib.client
9
9
  if typing.TYPE_CHECKING:
10
10
  import grpclib.server
11
11
 
12
+ import google.protobuf.empty_pb2
12
13
  import modal_proto.api_pb2
13
14
  import modal_proto.task_command_router_pb2
14
15
 
@@ -35,6 +36,14 @@ class TaskCommandRouterBase(abc.ABC):
35
36
  async def TaskExecWait(self, stream: 'grpclib.server.Stream[modal_proto.task_command_router_pb2.TaskExecWaitRequest, modal_proto.task_command_router_pb2.TaskExecWaitResponse]') -> None:
36
37
  pass
37
38
 
39
+ @abc.abstractmethod
40
+ async def TaskMountDirectory(self, stream: 'grpclib.server.Stream[modal_proto.task_command_router_pb2.TaskMountDirectoryRequest, google.protobuf.empty_pb2.Empty]') -> None:
41
+ pass
42
+
43
+ @abc.abstractmethod
44
+ async def TaskSnapshotDirectory(self, stream: 'grpclib.server.Stream[modal_proto.task_command_router_pb2.TaskSnapshotDirectoryRequest, modal_proto.task_command_router_pb2.TaskSnapshotDirectoryResponse]') -> None:
45
+ pass
46
+
38
47
  def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
39
48
  return {
40
49
  '/modal.task_command_router.TaskCommandRouter/TaskExecPoll': grpclib.const.Handler(
@@ -67,6 +76,18 @@ class TaskCommandRouterBase(abc.ABC):
67
76
  modal_proto.task_command_router_pb2.TaskExecWaitRequest,
68
77
  modal_proto.task_command_router_pb2.TaskExecWaitResponse,
69
78
  ),
79
+ '/modal.task_command_router.TaskCommandRouter/TaskMountDirectory': grpclib.const.Handler(
80
+ self.TaskMountDirectory,
81
+ grpclib.const.Cardinality.UNARY_UNARY,
82
+ modal_proto.task_command_router_pb2.TaskMountDirectoryRequest,
83
+ google.protobuf.empty_pb2.Empty,
84
+ ),
85
+ '/modal.task_command_router.TaskCommandRouter/TaskSnapshotDirectory': grpclib.const.Handler(
86
+ self.TaskSnapshotDirectory,
87
+ grpclib.const.Cardinality.UNARY_UNARY,
88
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryRequest,
89
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryResponse,
90
+ ),
70
91
  }
71
92
 
72
93
 
@@ -103,3 +124,15 @@ class TaskCommandRouterStub:
103
124
  modal_proto.task_command_router_pb2.TaskExecWaitRequest,
104
125
  modal_proto.task_command_router_pb2.TaskExecWaitResponse,
105
126
  )
127
+ self.TaskMountDirectory = grpclib.client.UnaryUnaryMethod(
128
+ channel,
129
+ '/modal.task_command_router.TaskCommandRouter/TaskMountDirectory',
130
+ modal_proto.task_command_router_pb2.TaskMountDirectoryRequest,
131
+ google.protobuf.empty_pb2.Empty,
132
+ )
133
+ self.TaskSnapshotDirectory = grpclib.client.UnaryUnaryMethod(
134
+ channel,
135
+ '/modal.task_command_router.TaskCommandRouter/TaskSnapshotDirectory',
136
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryRequest,
137
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryResponse,
138
+ )
@@ -0,0 +1,180 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: modal_proto/task_command_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 google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
17
+ from modal_proto import api_pb2 as modal__proto_dot_api__pb2
18
+
19
+
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%modal_proto/task_command_router.proto\x12\x19modal.task_command_router\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15modal_proto/api.proto\"7\n\x13TaskExecPollRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\"G\n\x14TaskExecPollResponse\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\"\x92\x03\n\x14TaskExecStartRequest\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\x46\n\rstdout_config\x18\x04 \x01(\x0e\x32/.modal.task_command_router.TaskExecStdoutConfig\x12\x46\n\rstderr_config\x18\x05 \x01(\x0e\x32/.modal.task_command_router.TaskExecStderrConfig\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\"\x17\n\x15TaskExecStartResponse\"h\n\x19TaskExecStdinWriteRequest\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\"\x1c\n\x1aTaskExecStdinWriteResponse\"\x9d\x01\n\x18TaskExecStdioReadRequest\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\x12O\n\x0f\x66ile_descriptor\x18\x04 \x01(\x0e\x32\x36.modal.task_command_router.TaskExecStdioFileDescriptor\")\n\x19TaskExecStdioReadResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"7\n\x13TaskExecWaitRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\"G\n\x14TaskExecWaitResponse\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\"L\n\x19TaskMountDirectoryRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\x0c\x12\x10\n\x08image_id\x18\x03 \x01(\t\"=\n\x1cTaskSnapshotDirectoryRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\x0c\"1\n\x1dTaskSnapshotDirectoryResponse\x12\x10\n\x08image_id\x18\x01 \x01(\t*\x81\x01\n\x14TaskExecStderrConfig\x12#\n\x1fTASK_EXEC_STDERR_CONFIG_DEVNULL\x10\x00\x12 \n\x1cTASK_EXEC_STDERR_CONFIG_PIPE\x10\x01\x12\"\n\x1eTASK_EXEC_STDERR_CONFIG_STDOUT\x10\x02*u\n\x1bTaskExecStdioFileDescriptor\x12*\n&TASK_EXEC_STDIO_FILE_DESCRIPTOR_STDOUT\x10\x00\x12*\n&TASK_EXEC_STDIO_FILE_DESCRIPTOR_STDERR\x10\x01*]\n\x14TaskExecStdoutConfig\x12#\n\x1fTASK_EXEC_STDOUT_CONFIG_DEVNULL\x10\x00\x12 \n\x1cTASK_EXEC_STDOUT_CONFIG_PIPE\x10\x01\x32\xe1\x06\n\x11TaskCommandRouter\x12o\n\x0cTaskExecPoll\x12..modal.task_command_router.TaskExecPollRequest\x1a/.modal.task_command_router.TaskExecPollResponse\x12r\n\rTaskExecStart\x12/.modal.task_command_router.TaskExecStartRequest\x1a\x30.modal.task_command_router.TaskExecStartResponse\x12\x81\x01\n\x12TaskExecStdinWrite\x12\x34.modal.task_command_router.TaskExecStdinWriteRequest\x1a\x35.modal.task_command_router.TaskExecStdinWriteResponse\x12\x80\x01\n\x11TaskExecStdioRead\x12\x33.modal.task_command_router.TaskExecStdioReadRequest\x1a\x34.modal.task_command_router.TaskExecStdioReadResponse0\x01\x12o\n\x0cTaskExecWait\x12..modal.task_command_router.TaskExecWaitRequest\x1a/.modal.task_command_router.TaskExecWaitResponse\x12\x62\n\x12TaskMountDirectory\x12\x34.modal.task_command_router.TaskMountDirectoryRequest\x1a\x16.google.protobuf.Empty\x12\x8a\x01\n\x15TaskSnapshotDirectory\x12\x37.modal.task_command_router.TaskSnapshotDirectoryRequest\x1a\x38.modal.task_command_router.TaskSnapshotDirectoryResponseB&Z$github.com/modal-labs/modal/go/protob\x06proto3')
21
+
22
+ _TASKEXECSTDERRCONFIG = DESCRIPTOR.enum_types_by_name['TaskExecStderrConfig']
23
+ TaskExecStderrConfig = enum_type_wrapper.EnumTypeWrapper(_TASKEXECSTDERRCONFIG)
24
+ _TASKEXECSTDIOFILEDESCRIPTOR = DESCRIPTOR.enum_types_by_name['TaskExecStdioFileDescriptor']
25
+ TaskExecStdioFileDescriptor = enum_type_wrapper.EnumTypeWrapper(_TASKEXECSTDIOFILEDESCRIPTOR)
26
+ _TASKEXECSTDOUTCONFIG = DESCRIPTOR.enum_types_by_name['TaskExecStdoutConfig']
27
+ TaskExecStdoutConfig = enum_type_wrapper.EnumTypeWrapper(_TASKEXECSTDOUTCONFIG)
28
+ TASK_EXEC_STDERR_CONFIG_DEVNULL = 0
29
+ TASK_EXEC_STDERR_CONFIG_PIPE = 1
30
+ TASK_EXEC_STDERR_CONFIG_STDOUT = 2
31
+ TASK_EXEC_STDIO_FILE_DESCRIPTOR_STDOUT = 0
32
+ TASK_EXEC_STDIO_FILE_DESCRIPTOR_STDERR = 1
33
+ TASK_EXEC_STDOUT_CONFIG_DEVNULL = 0
34
+ TASK_EXEC_STDOUT_CONFIG_PIPE = 1
35
+
36
+
37
+ _TASKEXECPOLLREQUEST = DESCRIPTOR.message_types_by_name['TaskExecPollRequest']
38
+ _TASKEXECPOLLRESPONSE = DESCRIPTOR.message_types_by_name['TaskExecPollResponse']
39
+ _TASKEXECSTARTREQUEST = DESCRIPTOR.message_types_by_name['TaskExecStartRequest']
40
+ _TASKEXECSTARTRESPONSE = DESCRIPTOR.message_types_by_name['TaskExecStartResponse']
41
+ _TASKEXECSTDINWRITEREQUEST = DESCRIPTOR.message_types_by_name['TaskExecStdinWriteRequest']
42
+ _TASKEXECSTDINWRITERESPONSE = DESCRIPTOR.message_types_by_name['TaskExecStdinWriteResponse']
43
+ _TASKEXECSTDIOREADREQUEST = DESCRIPTOR.message_types_by_name['TaskExecStdioReadRequest']
44
+ _TASKEXECSTDIOREADRESPONSE = DESCRIPTOR.message_types_by_name['TaskExecStdioReadResponse']
45
+ _TASKEXECWAITREQUEST = DESCRIPTOR.message_types_by_name['TaskExecWaitRequest']
46
+ _TASKEXECWAITRESPONSE = DESCRIPTOR.message_types_by_name['TaskExecWaitResponse']
47
+ _TASKMOUNTDIRECTORYREQUEST = DESCRIPTOR.message_types_by_name['TaskMountDirectoryRequest']
48
+ _TASKSNAPSHOTDIRECTORYREQUEST = DESCRIPTOR.message_types_by_name['TaskSnapshotDirectoryRequest']
49
+ _TASKSNAPSHOTDIRECTORYRESPONSE = DESCRIPTOR.message_types_by_name['TaskSnapshotDirectoryResponse']
50
+ TaskExecPollRequest = _reflection.GeneratedProtocolMessageType('TaskExecPollRequest', (_message.Message,), {
51
+ 'DESCRIPTOR' : _TASKEXECPOLLREQUEST,
52
+ '__module__' : 'modal_proto.task_command_router_pb2'
53
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecPollRequest)
54
+ })
55
+ _sym_db.RegisterMessage(TaskExecPollRequest)
56
+
57
+ TaskExecPollResponse = _reflection.GeneratedProtocolMessageType('TaskExecPollResponse', (_message.Message,), {
58
+ 'DESCRIPTOR' : _TASKEXECPOLLRESPONSE,
59
+ '__module__' : 'modal_proto.task_command_router_pb2'
60
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecPollResponse)
61
+ })
62
+ _sym_db.RegisterMessage(TaskExecPollResponse)
63
+
64
+ TaskExecStartRequest = _reflection.GeneratedProtocolMessageType('TaskExecStartRequest', (_message.Message,), {
65
+ 'DESCRIPTOR' : _TASKEXECSTARTREQUEST,
66
+ '__module__' : 'modal_proto.task_command_router_pb2'
67
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStartRequest)
68
+ })
69
+ _sym_db.RegisterMessage(TaskExecStartRequest)
70
+
71
+ TaskExecStartResponse = _reflection.GeneratedProtocolMessageType('TaskExecStartResponse', (_message.Message,), {
72
+ 'DESCRIPTOR' : _TASKEXECSTARTRESPONSE,
73
+ '__module__' : 'modal_proto.task_command_router_pb2'
74
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStartResponse)
75
+ })
76
+ _sym_db.RegisterMessage(TaskExecStartResponse)
77
+
78
+ TaskExecStdinWriteRequest = _reflection.GeneratedProtocolMessageType('TaskExecStdinWriteRequest', (_message.Message,), {
79
+ 'DESCRIPTOR' : _TASKEXECSTDINWRITEREQUEST,
80
+ '__module__' : 'modal_proto.task_command_router_pb2'
81
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStdinWriteRequest)
82
+ })
83
+ _sym_db.RegisterMessage(TaskExecStdinWriteRequest)
84
+
85
+ TaskExecStdinWriteResponse = _reflection.GeneratedProtocolMessageType('TaskExecStdinWriteResponse', (_message.Message,), {
86
+ 'DESCRIPTOR' : _TASKEXECSTDINWRITERESPONSE,
87
+ '__module__' : 'modal_proto.task_command_router_pb2'
88
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStdinWriteResponse)
89
+ })
90
+ _sym_db.RegisterMessage(TaskExecStdinWriteResponse)
91
+
92
+ TaskExecStdioReadRequest = _reflection.GeneratedProtocolMessageType('TaskExecStdioReadRequest', (_message.Message,), {
93
+ 'DESCRIPTOR' : _TASKEXECSTDIOREADREQUEST,
94
+ '__module__' : 'modal_proto.task_command_router_pb2'
95
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStdioReadRequest)
96
+ })
97
+ _sym_db.RegisterMessage(TaskExecStdioReadRequest)
98
+
99
+ TaskExecStdioReadResponse = _reflection.GeneratedProtocolMessageType('TaskExecStdioReadResponse', (_message.Message,), {
100
+ 'DESCRIPTOR' : _TASKEXECSTDIOREADRESPONSE,
101
+ '__module__' : 'modal_proto.task_command_router_pb2'
102
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecStdioReadResponse)
103
+ })
104
+ _sym_db.RegisterMessage(TaskExecStdioReadResponse)
105
+
106
+ TaskExecWaitRequest = _reflection.GeneratedProtocolMessageType('TaskExecWaitRequest', (_message.Message,), {
107
+ 'DESCRIPTOR' : _TASKEXECWAITREQUEST,
108
+ '__module__' : 'modal_proto.task_command_router_pb2'
109
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecWaitRequest)
110
+ })
111
+ _sym_db.RegisterMessage(TaskExecWaitRequest)
112
+
113
+ TaskExecWaitResponse = _reflection.GeneratedProtocolMessageType('TaskExecWaitResponse', (_message.Message,), {
114
+ 'DESCRIPTOR' : _TASKEXECWAITRESPONSE,
115
+ '__module__' : 'modal_proto.task_command_router_pb2'
116
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskExecWaitResponse)
117
+ })
118
+ _sym_db.RegisterMessage(TaskExecWaitResponse)
119
+
120
+ TaskMountDirectoryRequest = _reflection.GeneratedProtocolMessageType('TaskMountDirectoryRequest', (_message.Message,), {
121
+ 'DESCRIPTOR' : _TASKMOUNTDIRECTORYREQUEST,
122
+ '__module__' : 'modal_proto.task_command_router_pb2'
123
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskMountDirectoryRequest)
124
+ })
125
+ _sym_db.RegisterMessage(TaskMountDirectoryRequest)
126
+
127
+ TaskSnapshotDirectoryRequest = _reflection.GeneratedProtocolMessageType('TaskSnapshotDirectoryRequest', (_message.Message,), {
128
+ 'DESCRIPTOR' : _TASKSNAPSHOTDIRECTORYREQUEST,
129
+ '__module__' : 'modal_proto.task_command_router_pb2'
130
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskSnapshotDirectoryRequest)
131
+ })
132
+ _sym_db.RegisterMessage(TaskSnapshotDirectoryRequest)
133
+
134
+ TaskSnapshotDirectoryResponse = _reflection.GeneratedProtocolMessageType('TaskSnapshotDirectoryResponse', (_message.Message,), {
135
+ 'DESCRIPTOR' : _TASKSNAPSHOTDIRECTORYRESPONSE,
136
+ '__module__' : 'modal_proto.task_command_router_pb2'
137
+ # @@protoc_insertion_point(class_scope:modal.task_command_router.TaskSnapshotDirectoryResponse)
138
+ })
139
+ _sym_db.RegisterMessage(TaskSnapshotDirectoryResponse)
140
+
141
+ _TASKCOMMANDROUTER = DESCRIPTOR.services_by_name['TaskCommandRouter']
142
+ if _descriptor._USE_C_DESCRIPTORS == False:
143
+
144
+ DESCRIPTOR._options = None
145
+ DESCRIPTOR._serialized_options = b'Z$github.com/modal-labs/modal/go/proto'
146
+ _TASKEXECSTDERRCONFIG._serialized_start=1342
147
+ _TASKEXECSTDERRCONFIG._serialized_end=1471
148
+ _TASKEXECSTDIOFILEDESCRIPTOR._serialized_start=1473
149
+ _TASKEXECSTDIOFILEDESCRIPTOR._serialized_end=1590
150
+ _TASKEXECSTDOUTCONFIG._serialized_start=1592
151
+ _TASKEXECSTDOUTCONFIG._serialized_end=1685
152
+ _TASKEXECPOLLREQUEST._serialized_start=120
153
+ _TASKEXECPOLLREQUEST._serialized_end=175
154
+ _TASKEXECPOLLRESPONSE._serialized_start=177
155
+ _TASKEXECPOLLRESPONSE._serialized_end=248
156
+ _TASKEXECSTARTREQUEST._serialized_start=251
157
+ _TASKEXECSTARTREQUEST._serialized_end=653
158
+ _TASKEXECSTARTRESPONSE._serialized_start=655
159
+ _TASKEXECSTARTRESPONSE._serialized_end=678
160
+ _TASKEXECSTDINWRITEREQUEST._serialized_start=680
161
+ _TASKEXECSTDINWRITEREQUEST._serialized_end=784
162
+ _TASKEXECSTDINWRITERESPONSE._serialized_start=786
163
+ _TASKEXECSTDINWRITERESPONSE._serialized_end=814
164
+ _TASKEXECSTDIOREADREQUEST._serialized_start=817
165
+ _TASKEXECSTDIOREADREQUEST._serialized_end=974
166
+ _TASKEXECSTDIOREADRESPONSE._serialized_start=976
167
+ _TASKEXECSTDIOREADRESPONSE._serialized_end=1017
168
+ _TASKEXECWAITREQUEST._serialized_start=1019
169
+ _TASKEXECWAITREQUEST._serialized_end=1074
170
+ _TASKEXECWAITRESPONSE._serialized_start=1076
171
+ _TASKEXECWAITRESPONSE._serialized_end=1147
172
+ _TASKMOUNTDIRECTORYREQUEST._serialized_start=1149
173
+ _TASKMOUNTDIRECTORYREQUEST._serialized_end=1225
174
+ _TASKSNAPSHOTDIRECTORYREQUEST._serialized_start=1227
175
+ _TASKSNAPSHOTDIRECTORYREQUEST._serialized_end=1288
176
+ _TASKSNAPSHOTDIRECTORYRESPONSE._serialized_start=1290
177
+ _TASKSNAPSHOTDIRECTORYRESPONSE._serialized_end=1339
178
+ _TASKCOMMANDROUTER._serialized_start=1688
179
+ _TASKCOMMANDROUTER._serialized_end=2553
180
+ # @@protoc_insertion_point(module_scope)
@@ -331,3 +331,54 @@ class TaskExecWaitResponse(google.protobuf.message.Message):
331
331
  def WhichOneof(self, oneof_group: typing_extensions.Literal["exit_status", b"exit_status"]) -> typing_extensions.Literal["code", "signal"] | None: ...
332
332
 
333
333
  global___TaskExecWaitResponse = TaskExecWaitResponse
334
+
335
+ class TaskMountDirectoryRequest(google.protobuf.message.Message):
336
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
337
+
338
+ TASK_ID_FIELD_NUMBER: builtins.int
339
+ PATH_FIELD_NUMBER: builtins.int
340
+ IMAGE_ID_FIELD_NUMBER: builtins.int
341
+ task_id: builtins.str
342
+ path: builtins.bytes
343
+ image_id: builtins.str
344
+ def __init__(
345
+ self,
346
+ *,
347
+ task_id: builtins.str = ...,
348
+ path: builtins.bytes = ...,
349
+ image_id: builtins.str = ...,
350
+ ) -> None: ...
351
+ def ClearField(self, field_name: typing_extensions.Literal["image_id", b"image_id", "path", b"path", "task_id", b"task_id"]) -> None: ...
352
+
353
+ global___TaskMountDirectoryRequest = TaskMountDirectoryRequest
354
+
355
+ class TaskSnapshotDirectoryRequest(google.protobuf.message.Message):
356
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
357
+
358
+ TASK_ID_FIELD_NUMBER: builtins.int
359
+ PATH_FIELD_NUMBER: builtins.int
360
+ task_id: builtins.str
361
+ path: builtins.bytes
362
+ def __init__(
363
+ self,
364
+ *,
365
+ task_id: builtins.str = ...,
366
+ path: builtins.bytes = ...,
367
+ ) -> None: ...
368
+ def ClearField(self, field_name: typing_extensions.Literal["path", b"path", "task_id", b"task_id"]) -> None: ...
369
+
370
+ global___TaskSnapshotDirectoryRequest = TaskSnapshotDirectoryRequest
371
+
372
+ class TaskSnapshotDirectoryResponse(google.protobuf.message.Message):
373
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
374
+
375
+ IMAGE_ID_FIELD_NUMBER: builtins.int
376
+ image_id: builtins.str
377
+ def __init__(
378
+ self,
379
+ *,
380
+ image_id: builtins.str = ...,
381
+ ) -> None: ...
382
+ def ClearField(self, field_name: typing_extensions.Literal["image_id", b"image_id"]) -> None: ...
383
+
384
+ global___TaskSnapshotDirectoryResponse = TaskSnapshotDirectoryResponse
@@ -2,6 +2,7 @@
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
4
 
5
+ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
5
6
  from modal_proto import task_command_router_pb2 as modal__proto_dot_task__command__router__pb2
6
7
 
7
8
 
@@ -39,6 +40,16 @@ class TaskCommandRouterStub(object):
39
40
  request_serializer=modal__proto_dot_task__command__router__pb2.TaskExecWaitRequest.SerializeToString,
40
41
  response_deserializer=modal__proto_dot_task__command__router__pb2.TaskExecWaitResponse.FromString,
41
42
  )
43
+ self.TaskMountDirectory = channel.unary_unary(
44
+ '/modal.task_command_router.TaskCommandRouter/TaskMountDirectory',
45
+ request_serializer=modal__proto_dot_task__command__router__pb2.TaskMountDirectoryRequest.SerializeToString,
46
+ response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
47
+ )
48
+ self.TaskSnapshotDirectory = channel.unary_unary(
49
+ '/modal.task_command_router.TaskCommandRouter/TaskSnapshotDirectory',
50
+ request_serializer=modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryRequest.SerializeToString,
51
+ response_deserializer=modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryResponse.FromString,
52
+ )
42
53
 
43
54
 
44
55
  class TaskCommandRouterServicer(object):
@@ -79,6 +90,20 @@ class TaskCommandRouterServicer(object):
79
90
  context.set_details('Method not implemented!')
80
91
  raise NotImplementedError('Method not implemented!')
81
92
 
93
+ def TaskMountDirectory(self, request, context):
94
+ """Mount an image at a directory in the container.
95
+ """
96
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
97
+ context.set_details('Method not implemented!')
98
+ raise NotImplementedError('Method not implemented!')
99
+
100
+ def TaskSnapshotDirectory(self, request, context):
101
+ """Snapshot a directory with a mounted image, including any local changes, into a new image.
102
+ """
103
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
104
+ context.set_details('Method not implemented!')
105
+ raise NotImplementedError('Method not implemented!')
106
+
82
107
 
83
108
  def add_TaskCommandRouterServicer_to_server(servicer, server):
84
109
  rpc_method_handlers = {
@@ -107,6 +132,16 @@ def add_TaskCommandRouterServicer_to_server(servicer, server):
107
132
  request_deserializer=modal__proto_dot_task__command__router__pb2.TaskExecWaitRequest.FromString,
108
133
  response_serializer=modal__proto_dot_task__command__router__pb2.TaskExecWaitResponse.SerializeToString,
109
134
  ),
135
+ 'TaskMountDirectory': grpc.unary_unary_rpc_method_handler(
136
+ servicer.TaskMountDirectory,
137
+ request_deserializer=modal__proto_dot_task__command__router__pb2.TaskMountDirectoryRequest.FromString,
138
+ response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
139
+ ),
140
+ 'TaskSnapshotDirectory': grpc.unary_unary_rpc_method_handler(
141
+ servicer.TaskSnapshotDirectory,
142
+ request_deserializer=modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryRequest.FromString,
143
+ response_serializer=modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryResponse.SerializeToString,
144
+ ),
110
145
  }
111
146
  generic_handler = grpc.method_handlers_generic_handler(
112
147
  'modal.task_command_router.TaskCommandRouter', rpc_method_handlers)
@@ -201,3 +236,37 @@ class TaskCommandRouter(object):
201
236
  modal__proto_dot_task__command__router__pb2.TaskExecWaitResponse.FromString,
202
237
  options, channel_credentials,
203
238
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
239
+
240
+ @staticmethod
241
+ def TaskMountDirectory(request,
242
+ target,
243
+ options=(),
244
+ channel_credentials=None,
245
+ call_credentials=None,
246
+ insecure=False,
247
+ compression=None,
248
+ wait_for_ready=None,
249
+ timeout=None,
250
+ metadata=None):
251
+ return grpc.experimental.unary_unary(request, target, '/modal.task_command_router.TaskCommandRouter/TaskMountDirectory',
252
+ modal__proto_dot_task__command__router__pb2.TaskMountDirectoryRequest.SerializeToString,
253
+ google_dot_protobuf_dot_empty__pb2.Empty.FromString,
254
+ options, channel_credentials,
255
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
256
+
257
+ @staticmethod
258
+ def TaskSnapshotDirectory(request,
259
+ target,
260
+ options=(),
261
+ channel_credentials=None,
262
+ call_credentials=None,
263
+ insecure=False,
264
+ compression=None,
265
+ wait_for_ready=None,
266
+ timeout=None,
267
+ metadata=None):
268
+ return grpc.experimental.unary_unary(request, target, '/modal.task_command_router.TaskCommandRouter/TaskSnapshotDirectory',
269
+ modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryRequest.SerializeToString,
270
+ modal__proto_dot_task__command__router__pb2.TaskSnapshotDirectoryResponse.FromString,
271
+ options, channel_credentials,
272
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -4,6 +4,7 @@ isort:skip_file
4
4
  """
5
5
  import abc
6
6
  import collections.abc
7
+ import google.protobuf.empty_pb2
7
8
  import grpc
8
9
  import modal_proto.task_command_router_pb2
9
10
 
@@ -34,6 +35,16 @@ class TaskCommandRouterStub:
34
35
  modal_proto.task_command_router_pb2.TaskExecWaitResponse,
35
36
  ]
36
37
  """Wait for an exec'd command to exit and return the exit code."""
38
+ TaskMountDirectory: grpc.UnaryUnaryMultiCallable[
39
+ modal_proto.task_command_router_pb2.TaskMountDirectoryRequest,
40
+ google.protobuf.empty_pb2.Empty,
41
+ ]
42
+ """Mount an image at a directory in the container."""
43
+ TaskSnapshotDirectory: grpc.UnaryUnaryMultiCallable[
44
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryRequest,
45
+ modal_proto.task_command_router_pb2.TaskSnapshotDirectoryResponse,
46
+ ]
47
+ """Snapshot a directory with a mounted image, including any local changes, into a new image."""
37
48
 
38
49
  class TaskCommandRouterServicer(metaclass=abc.ABCMeta):
39
50
  @abc.abstractmethod
@@ -71,5 +82,19 @@ class TaskCommandRouterServicer(metaclass=abc.ABCMeta):
71
82
  context: grpc.ServicerContext,
72
83
  ) -> modal_proto.task_command_router_pb2.TaskExecWaitResponse:
73
84
  """Wait for an exec'd command to exit and return the exit code."""
85
+ @abc.abstractmethod
86
+ def TaskMountDirectory(
87
+ self,
88
+ request: modal_proto.task_command_router_pb2.TaskMountDirectoryRequest,
89
+ context: grpc.ServicerContext,
90
+ ) -> google.protobuf.empty_pb2.Empty:
91
+ """Mount an image at a directory in the container."""
92
+ @abc.abstractmethod
93
+ def TaskSnapshotDirectory(
94
+ self,
95
+ request: modal_proto.task_command_router_pb2.TaskSnapshotDirectoryRequest,
96
+ context: grpc.ServicerContext,
97
+ ) -> modal_proto.task_command_router_pb2.TaskSnapshotDirectoryResponse:
98
+ """Snapshot a directory with a mounted image, including any local changes, into a new image."""
74
99
 
75
100
  def add_TaskCommandRouterServicer_to_server(servicer: TaskCommandRouterServicer, server: grpc.Server) -> None: ...
@@ -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.dev28"
4
+ __version__ = "1.2.6.dev0"