modAL 1.2.5.dev28__py3-none-any.whl → 1.2.6.dev0__py3-none-any.whl

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.
modal/client.pyi CHANGED
@@ -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
@@ -26,7 +26,7 @@ modal/app.pyi,sha256=nI_Tibj-rI5I7dJFJnczbHvcmVzCvvCih0tMzoQlr_Y,50835
26
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
27
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
28
  modal/client.py,sha256=k1CqQ_0t4-vHylkqYZgYCnClg-FT0QrTPAKivL01A_k,14354
29
- modal/client.pyi,sha256=iEXtfWVImLL0-wW5E1D-7MEPe4Q7FnlEFYkl-lptEuc,13148
29
+ modal/client.pyi,sha256=zMlh7GyzOVrGrtkQddiAbCSzgVeRSOu8vsbIWUYR1aw,13146
30
30
  modal/cloud_bucket_mount.py,sha256=cvVj5Rt4nDHoQbTneoJPTaAcnl_Ab_mrsjnnzd0v9OI,6013
31
31
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
32
  modal/cls.py,sha256=4T__mtYlQUnkatif1Wnr8Ld9DN_ySydHj2UwhRg89ok,41984
@@ -160,7 +160,7 @@ modal/experimental/__init__.py,sha256=GOuo3t4-Le0ZVddiHIOw0MQxkdTJge-bVbhDvgnblm
160
160
  modal/experimental/flash.py,sha256=GJZwSr-4OHlP6gCIZdcbsSb8D8WX9xJwMphjwcfsRoU,31262
161
161
  modal/experimental/flash.pyi,sha256=q4a3mdgL0jzATPL2tS7LpuyulYzF1vUSE453S9xc8n8,16965
162
162
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
163
- modal-1.2.5.dev28.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
163
+ modal-1.2.6.dev0.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
164
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
165
165
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
166
166
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -176,16 +176,16 @@ modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,2
176
176
  modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
177
177
  modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_proto/task_command_router.proto,sha256=xAVsFyIff6Yvp-PoS3kwyag2G73tBht2KtF4CWKeewI,5000
180
- modal_proto/task_command_router_grpc.py,sha256=qxuVUaVwLtCUZGHnYYqUHPvzYepEwt_hXaq2KndPwys,5097
181
- modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_AgxwnowxvQbtvk,10616
182
- modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
183
- modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
184
- modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
185
- modal_version/__init__.py,sha256=QG7KmZxkKcXMI0bCR6mrl4nSLgi9HtpAaNVbOvm_VL4,121
179
+ modal_proto/task_command_router.proto,sha256=oyHT02Ck7jrBe55s4ge5f2ko58-2sg3gZ-xEvvn5bXU,5620
180
+ modal_proto/task_command_router_grpc.py,sha256=_K9lOLOB_pyT8-XvGnicgAIW1aLVFTqQISmP7Q1x4e8,6962
181
+ modal_proto/task_command_router_pb2.py,sha256=2Y8wRvnq4_7RiQ-5ZAPIgXaxrHv_MXzgS5wyWVJmQTo,13107
182
+ modal_proto/task_command_router_pb2.pyi,sha256=yI4tFteErLlonFA2HyaWtONfhY_VGSe7KCWFIspvmkE,16323
183
+ modal_proto/task_command_router_pb2_grpc.py,sha256=q2VWfK2-4uDcPaPLhAqPZkgxhuQRYnWmwUcnEbPbGuk,13895
184
+ modal_proto/task_command_router_pb2_grpc.pyi,sha256=e1MM10VGUgDkm041v53QeTglGQPzTpA0FUsFtezjp74,4536
185
+ modal_version/__init__.py,sha256=5f_APWvnOJPDe2Oq-2ImRwfqfFcQXUgQ3IdkZYG0o1U,120
186
186
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
187
- modal-1.2.5.dev28.dist-info/METADATA,sha256=eMsRvY9ec0WqrglKjVUKAcSQ2Vd7ZuTUtjjos8Qbjrk,2490
188
- modal-1.2.5.dev28.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
189
- modal-1.2.5.dev28.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
190
- modal-1.2.5.dev28.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
191
- modal-1.2.5.dev28.dist-info/RECORD,,
187
+ modal-1.2.6.dev0.dist-info/METADATA,sha256=YyAXlm_yykFKClmgFSb2cl6Mw0SH6RSq_ytaIIDidQE,2489
188
+ modal-1.2.6.dev0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
189
+ modal-1.2.6.dev0.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
190
+ modal-1.2.6.dev0.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
191
+ modal-1.2.6.dev0.dist-info/RECORD,,
@@ -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
+ )
@@ -13,10 +13,11 @@ from google.protobuf import symbol_database as _symbol_database
13
13
  _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
+ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
16
17
  from modal_proto import api_pb2 as modal__proto_dot_api__pb2
17
18
 
18
19
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%modal_proto/task_command_router.proto\x12\x19modal.task_command_router\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*\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\xf0\x04\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.TaskExecWaitResponseB&Z$github.com/modal-labs/modal/go/protob\x06proto3')
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')
20
21
 
21
22
  _TASKEXECSTDERRCONFIG = DESCRIPTOR.enum_types_by_name['TaskExecStderrConfig']
22
23
  TaskExecStderrConfig = enum_type_wrapper.EnumTypeWrapper(_TASKEXECSTDERRCONFIG)
@@ -43,6 +44,9 @@ _TASKEXECSTDIOREADREQUEST = DESCRIPTOR.message_types_by_name['TaskExecStdioReadR
43
44
  _TASKEXECSTDIOREADRESPONSE = DESCRIPTOR.message_types_by_name['TaskExecStdioReadResponse']
44
45
  _TASKEXECWAITREQUEST = DESCRIPTOR.message_types_by_name['TaskExecWaitRequest']
45
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']
46
50
  TaskExecPollRequest = _reflection.GeneratedProtocolMessageType('TaskExecPollRequest', (_message.Message,), {
47
51
  'DESCRIPTOR' : _TASKEXECPOLLREQUEST,
48
52
  '__module__' : 'modal_proto.task_command_router_pb2'
@@ -113,37 +117,64 @@ TaskExecWaitResponse = _reflection.GeneratedProtocolMessageType('TaskExecWaitRes
113
117
  })
114
118
  _sym_db.RegisterMessage(TaskExecWaitResponse)
115
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
+
116
141
  _TASKCOMMANDROUTER = DESCRIPTOR.services_by_name['TaskCommandRouter']
117
142
  if _descriptor._USE_C_DESCRIPTORS == False:
118
143
 
119
144
  DESCRIPTOR._options = None
120
145
  DESCRIPTOR._serialized_options = b'Z$github.com/modal-labs/modal/go/proto'
121
- _TASKEXECSTDERRCONFIG._serialized_start=1121
122
- _TASKEXECSTDERRCONFIG._serialized_end=1250
123
- _TASKEXECSTDIOFILEDESCRIPTOR._serialized_start=1252
124
- _TASKEXECSTDIOFILEDESCRIPTOR._serialized_end=1369
125
- _TASKEXECSTDOUTCONFIG._serialized_start=1371
126
- _TASKEXECSTDOUTCONFIG._serialized_end=1464
127
- _TASKEXECPOLLREQUEST._serialized_start=91
128
- _TASKEXECPOLLREQUEST._serialized_end=146
129
- _TASKEXECPOLLRESPONSE._serialized_start=148
130
- _TASKEXECPOLLRESPONSE._serialized_end=219
131
- _TASKEXECSTARTREQUEST._serialized_start=222
132
- _TASKEXECSTARTREQUEST._serialized_end=624
133
- _TASKEXECSTARTRESPONSE._serialized_start=626
134
- _TASKEXECSTARTRESPONSE._serialized_end=649
135
- _TASKEXECSTDINWRITEREQUEST._serialized_start=651
136
- _TASKEXECSTDINWRITEREQUEST._serialized_end=755
137
- _TASKEXECSTDINWRITERESPONSE._serialized_start=757
138
- _TASKEXECSTDINWRITERESPONSE._serialized_end=785
139
- _TASKEXECSTDIOREADREQUEST._serialized_start=788
140
- _TASKEXECSTDIOREADREQUEST._serialized_end=945
141
- _TASKEXECSTDIOREADRESPONSE._serialized_start=947
142
- _TASKEXECSTDIOREADRESPONSE._serialized_end=988
143
- _TASKEXECWAITREQUEST._serialized_start=990
144
- _TASKEXECWAITREQUEST._serialized_end=1045
145
- _TASKEXECWAITRESPONSE._serialized_start=1047
146
- _TASKEXECWAITRESPONSE._serialized_end=1118
147
- _TASKCOMMANDROUTER._serialized_start=1467
148
- _TASKCOMMANDROUTER._serialized_end=2091
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
149
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: ...
modal_version/__init__.py CHANGED
@@ -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"