modal 0.74.14__py3-none-any.whl → 0.74.16__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/volume.pyi CHANGED
@@ -1,6 +1,8 @@
1
+ import _io
1
2
  import asyncio.locks
2
3
  import collections.abc
3
4
  import enum
5
+ import google.protobuf.message
4
6
  import modal._object
5
7
  import modal._utils.blob_utils
6
8
  import modal.client
@@ -36,6 +38,7 @@ class FileEntry:
36
38
 
37
39
  class _Volume(modal._object._Object):
38
40
  _lock: typing.Optional[asyncio.locks.Lock]
41
+ _metadata: typing.Optional[modal_proto.api_pb2.VolumeMetadata]
39
42
 
40
43
  async def _get_lock(self): ...
41
44
  @staticmethod
@@ -46,6 +49,8 @@ class _Volume(modal._object._Object):
46
49
  create_if_missing: bool = False,
47
50
  version: typing.Optional[int] = None,
48
51
  ) -> _Volume: ...
52
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
53
+ def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
49
54
  @classmethod
50
55
  def ephemeral(
51
56
  cls: type[_Volume],
@@ -80,7 +85,7 @@ class _Volume(modal._object._Object):
80
85
  async def read_file_into_fileobj(self, path: str, fileobj: typing.IO[bytes]) -> int: ...
81
86
  async def remove_file(self, path: str, recursive: bool = False) -> None: ...
82
87
  async def copy_files(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
83
- async def batch_upload(self, force: bool = False) -> _VolumeUploadContextManager: ...
88
+ async def batch_upload(self, force: bool = False) -> _AbstractVolumeUploadContextManager: ...
84
89
  async def _instance_delete(self): ...
85
90
  @staticmethod
86
91
  async def delete(
@@ -95,44 +100,11 @@ class _Volume(modal._object._Object):
95
100
  environment_name: typing.Optional[str] = None,
96
101
  ): ...
97
102
 
98
- class _VolumeUploadContextManager:
99
- _volume_id: str
100
- _client: modal.client._Client
101
- _force: bool
102
- progress_cb: collections.abc.Callable[..., typing.Any]
103
- _upload_generators: list[
104
- collections.abc.Generator[collections.abc.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
105
- ]
106
-
107
- def __init__(
108
- self,
109
- volume_id: str,
110
- client: modal.client._Client,
111
- progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
112
- force: bool = False,
113
- ): ...
114
- async def __aenter__(self): ...
115
- async def __aexit__(self, exc_type, exc_val, exc_tb): ...
116
- def put_file(
117
- self,
118
- local_file: typing.Union[pathlib.Path, str, typing.BinaryIO],
119
- remote_path: typing.Union[pathlib.PurePosixPath, str],
120
- mode: typing.Optional[int] = None,
121
- ): ...
122
- def put_directory(
123
- self,
124
- local_path: typing.Union[pathlib.Path, str],
125
- remote_path: typing.Union[pathlib.PurePosixPath, str],
126
- recursive: bool = True,
127
- ): ...
128
- async def _upload_file(
129
- self, file_spec: modal._utils.blob_utils.FileUploadSpec
130
- ) -> modal_proto.api_pb2.MountFile: ...
131
-
132
103
  SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
133
104
 
134
105
  class Volume(modal.object.Object):
135
106
  _lock: typing.Optional[asyncio.locks.Lock]
107
+ _metadata: typing.Optional[modal_proto.api_pb2.VolumeMetadata]
136
108
 
137
109
  def __init__(self, *args, **kwargs): ...
138
110
 
@@ -150,6 +122,8 @@ class Volume(modal.object.Object):
150
122
  create_if_missing: bool = False,
151
123
  version: typing.Optional[int] = None,
152
124
  ) -> Volume: ...
125
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
126
+ def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
153
127
  @classmethod
154
128
  def ephemeral(
155
129
  cls: type[Volume],
@@ -256,8 +230,8 @@ class Volume(modal.object.Object):
256
230
  copy_files: __copy_files_spec[typing_extensions.Self]
257
231
 
258
232
  class __batch_upload_spec(typing_extensions.Protocol[SUPERSELF]):
259
- def __call__(self, force: bool = False) -> VolumeUploadContextManager: ...
260
- async def aio(self, force: bool = False) -> VolumeUploadContextManager: ...
233
+ def __call__(self, force: bool = False) -> AbstractVolumeUploadContextManager: ...
234
+ async def aio(self, force: bool = False) -> AbstractVolumeUploadContextManager: ...
261
235
 
262
236
  batch_upload: __batch_upload_spec[typing_extensions.Self]
263
237
 
@@ -303,7 +277,92 @@ class Volume(modal.object.Object):
303
277
 
304
278
  rename: __rename_spec
305
279
 
306
- class VolumeUploadContextManager:
280
+ class _AbstractVolumeUploadContextManager:
281
+ async def __aenter__(self): ...
282
+ async def __aexit__(self, exc_type, exc_val, exc_tb): ...
283
+ def put_file(
284
+ self,
285
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
286
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
287
+ mode: typing.Optional[int] = None,
288
+ ): ...
289
+ def put_directory(
290
+ self,
291
+ local_path: typing.Union[pathlib.Path, str],
292
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
293
+ recursive: bool = True,
294
+ ): ...
295
+ @staticmethod
296
+ def resolve(
297
+ version: int,
298
+ object_id: str,
299
+ client,
300
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
301
+ force: bool = False,
302
+ ) -> _AbstractVolumeUploadContextManager: ...
303
+
304
+ class AbstractVolumeUploadContextManager:
305
+ def __init__(self, /, *args, **kwargs): ...
306
+ def __enter__(self): ...
307
+ async def __aenter__(self): ...
308
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
309
+ async def __aexit__(self, exc_type, exc_val, exc_tb): ...
310
+ def put_file(
311
+ self,
312
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
313
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
314
+ mode: typing.Optional[int] = None,
315
+ ): ...
316
+ def put_directory(
317
+ self,
318
+ local_path: typing.Union[pathlib.Path, str],
319
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
320
+ recursive: bool = True,
321
+ ): ...
322
+ @staticmethod
323
+ def resolve(
324
+ version: int,
325
+ object_id: str,
326
+ client,
327
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
328
+ force: bool = False,
329
+ ) -> AbstractVolumeUploadContextManager: ...
330
+
331
+ class _VolumeUploadContextManager(_AbstractVolumeUploadContextManager):
332
+ _volume_id: str
333
+ _client: modal.client._Client
334
+ _force: bool
335
+ progress_cb: collections.abc.Callable[..., typing.Any]
336
+ _upload_generators: list[
337
+ collections.abc.Generator[collections.abc.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
338
+ ]
339
+
340
+ def __init__(
341
+ self,
342
+ volume_id: str,
343
+ client: modal.client._Client,
344
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
345
+ force: bool = False,
346
+ ): ...
347
+ async def __aenter__(self): ...
348
+ async def __aexit__(self, exc_type, exc_val, exc_tb): ...
349
+ def put_file(
350
+ self,
351
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
352
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
353
+ mode: typing.Optional[int] = None,
354
+ ): ...
355
+ def put_directory(
356
+ self,
357
+ local_path: typing.Union[pathlib.Path, str],
358
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
359
+ recursive: bool = True,
360
+ ): ...
361
+ async def _upload_file(
362
+ self, file_spec: modal._utils.blob_utils.FileUploadSpec
363
+ ) -> modal_proto.api_pb2.MountFile: ...
364
+
365
+ class VolumeUploadContextManager(AbstractVolumeUploadContextManager):
307
366
  _volume_id: str
308
367
  _client: modal.client.Client
309
368
  _force: bool
@@ -325,7 +384,7 @@ class VolumeUploadContextManager:
325
384
  async def __aexit__(self, exc_type, exc_val, exc_tb): ...
326
385
  def put_file(
327
386
  self,
328
- local_file: typing.Union[pathlib.Path, str, typing.BinaryIO],
387
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
329
388
  remote_path: typing.Union[pathlib.PurePosixPath, str],
330
389
  mode: typing.Optional[int] = None,
331
390
  ): ...
@@ -342,4 +401,85 @@ class VolumeUploadContextManager:
342
401
 
343
402
  _upload_file: ___upload_file_spec[typing_extensions.Self]
344
403
 
404
+ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
405
+ _volume_id: str
406
+ _client: modal.client._Client
407
+ _force: bool
408
+ _progress_cb: collections.abc.Callable[..., typing.Any]
409
+ _uploader_generators: list[
410
+ collections.abc.Generator[
411
+ collections.abc.Callable[[], typing.Awaitable[modal._utils.blob_utils.FileUploadSpec2]]
412
+ ]
413
+ ]
414
+
415
+ def __init__(
416
+ self,
417
+ volume_id: str,
418
+ client: modal.client._Client,
419
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
420
+ force: bool = False,
421
+ ): ...
422
+ async def __aenter__(self): ...
423
+ async def __aexit__(self, exc_type, exc_val, exc_tb): ...
424
+ def put_file(
425
+ self,
426
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
427
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
428
+ mode: typing.Optional[int] = None,
429
+ ): ...
430
+ def put_directory(
431
+ self,
432
+ local_path: typing.Union[pathlib.Path, str],
433
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
434
+ recursive: bool = True,
435
+ ): ...
436
+ async def _put_file_specs(self, file_specs: list[modal._utils.blob_utils.FileUploadSpec2]): ...
437
+
438
+ class VolumeUploadContextManager2(AbstractVolumeUploadContextManager):
439
+ _volume_id: str
440
+ _client: modal.client.Client
441
+ _force: bool
442
+ _progress_cb: collections.abc.Callable[..., typing.Any]
443
+ _uploader_generators: list[
444
+ collections.abc.Generator[
445
+ collections.abc.Callable[[], typing.Awaitable[modal._utils.blob_utils.FileUploadSpec2]]
446
+ ]
447
+ ]
448
+
449
+ def __init__(
450
+ self,
451
+ volume_id: str,
452
+ client: modal.client.Client,
453
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
454
+ force: bool = False,
455
+ ): ...
456
+ def __enter__(self): ...
457
+ async def __aenter__(self): ...
458
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
459
+ async def __aexit__(self, exc_type, exc_val, exc_tb): ...
460
+ def put_file(
461
+ self,
462
+ local_file: typing.Union[pathlib.Path, str, typing.BinaryIO, _io.BytesIO],
463
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
464
+ mode: typing.Optional[int] = None,
465
+ ): ...
466
+ def put_directory(
467
+ self,
468
+ local_path: typing.Union[pathlib.Path, str],
469
+ remote_path: typing.Union[pathlib.PurePosixPath, str],
470
+ recursive: bool = True,
471
+ ): ...
472
+
473
+ class ___put_file_specs_spec(typing_extensions.Protocol[SUPERSELF]):
474
+ def __call__(self, file_specs: list[modal._utils.blob_utils.FileUploadSpec2]): ...
475
+ async def aio(self, file_specs: list[modal._utils.blob_utils.FileUploadSpec2]): ...
476
+
477
+ _put_file_specs: ___put_file_specs_spec[typing_extensions.Self]
478
+
479
+ async def _put_missing_blocks(
480
+ file_specs: list[modal._utils.blob_utils.FileUploadSpec2],
481
+ missing_blocks: list,
482
+ put_responses: dict[bytes, bytes],
483
+ progress_cb: collections.abc.Callable[..., typing.Any],
484
+ ): ...
345
485
  def _open_files_error_annotation(mount_path: str) -> typing.Optional[str]: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.14
3
+ Version: 0.74.16
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=1GSPMMYRkG17FQwnA_PleK9YQrPQWXlN_4mpZ5VRA4Q,48468
22
22
  modal/app.pyi,sha256=bpC9uN_B4d_UtyXVuhGpXC2RM-IcsytS0ndu-GoKrHQ,27276
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
25
- modal/client.pyi,sha256=K1ooS9wvZZk-ldqnYjZXswq7NjJ23MXo6DZkX3OJtnA,7593
25
+ modal/client.pyi,sha256=MXDCG1c77_KDP7R66sApXRKz9ZnhLsZMjSETzBqGDzA,7593
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
28
  modal/cls.py,sha256=GvaNl8R5UsH7Vg88WEOyerdjvZEPK7xxi3nqHlyOW_c,33497
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=Ypd4NKsjOTnnnqXyTGGLKq5lkocRrUURYjY5Pi67_qA,670
78
78
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
79
79
  modal/token_flow.py,sha256=APNPQhuqy2avu6IY26U6OiN7erRhpo03Ztt1V60_wts,6776
80
80
  modal/token_flow.pyi,sha256=0XV3d-9CGQL3qjPdw3RgwIFVqqxo8Z-u044_mkgAM3o,2064
81
- modal/volume.py,sha256=JAWeDvoAG95tMBv-fYIERyHsJPS_X_xGpxRRmYtb6j0,30096
82
- modal/volume.pyi,sha256=kTsXarphjZILXci84LQy7EyC84eXUs5-7D62IM5q3eE,12491
81
+ modal/volume.py,sha256=3c5_aJNJtgpsFRZWBjc0jwn8Zs0jo9V6UDmh6ifrbdA,40145
82
+ modal/volume.pyi,sha256=juOVWGlgz7IeOY4M7jBhbeNRPA9xdGUwvA3AzlZUscQ,17958
83
83
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
84
84
  modal/_runtime/asgi.py,sha256=KNarxvZI9z8fnmZl2vbkWTjnoLXs9kqOahkrbsTLkyc,22429
85
85
  modal/_runtime/container_io_manager.py,sha256=0yNO3HTVIM4f338rxJavD8nrRN7KhDpjz1jLux71MRY,43842
@@ -92,7 +92,7 @@ modal/_runtime/user_code_imports.py,sha256=kAv37Pl1TmGKduv0Kozum0xNTD42bDLloSIsT
92
92
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
93
93
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
94
94
  modal/_utils/async_utils.py,sha256=b2TJyKY1Hq7df7M-fo3qlFM95mGdo3dCuqRPPcV5hsE,27445
95
- modal/_utils/blob_utils.py,sha256=jWJovk4g-YNG3CvkvglOds4a6D1M0Tcal_59v7y9VsM,14591
95
+ modal/_utils/blob_utils.py,sha256=WhWaSFLcffVDchMyfKys-j0EFVbm9l7rebzeoa7Z2jM,18214
96
96
  modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
97
97
  modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
98
98
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
@@ -132,7 +132,7 @@ modal/cli/run.py,sha256=NX2wWwj8HD6XUhnZRF808Qy9eeouv8KnvyOP57HqIXI,23637
132
132
  modal/cli/secret.py,sha256=WB_c-LE9-eDqleLpJxsJ9rZw62Eeza8ZFQFR10vNMEk,4197
133
133
  modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
134
134
  modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
135
- modal/cli/volume.py,sha256=c2IuVNO2yJVaXmZkRh3xwQmznlRTgFoJr_BIzzqtVv0,10251
135
+ modal/cli/volume.py,sha256=_PJ5Vn_prkLk_x1Lksx4kZySlKWqIn36T2Edd1-h7Mg,10497
136
136
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
137
137
  modal/cli/programs/run_jupyter.py,sha256=YVvJYu927A4ji72d6i27CKfyZ_uDWteeittARtJnf7E,2775
138
138
  modal/cli/programs/vscode.py,sha256=kfvhZQ4bJwtVm3MgC1V7AlygZOlKT1a33alr_uwrewA,3473
@@ -145,7 +145,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
145
145
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
146
146
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
147
147
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
148
- modal-0.74.14.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
148
+ modal-0.74.16.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
149
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
150
150
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
151
151
  modal_docs/gen_reference_docs.py,sha256=cvTgltucqYLLIX84QxAwf51Z5Vc2n6cLxS8VcrxNCAo,6401
@@ -153,13 +153,13 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
153
153
  modal_docs/mdmd/mdmd.py,sha256=Irx49MCCTlBOP4FBdLR--JrpA3-WhsVeriq0LGgsRic,6232
154
154
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
155
155
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
156
- modal_proto/api.proto,sha256=kovn2o64lk57QaRxqWPgFMuiR1ceZrrXw_U3B0DNuPQ,93026
157
- modal_proto/api_grpc.py,sha256=DlrVx10B6HLy4LjWrgK7HJ7kUNDKqEvm6mUqh-6EVvs,112161
158
- modal_proto/api_pb2.py,sha256=4GDk37vbGyrbdupsLVOojyEIFfqWyYptaYO9pLzM1ec,328101
159
- modal_proto/api_pb2.pyi,sha256=isSiMw7B3hyz-OeVS9xK6Jnk3TaEVea_aAAx4T7aW_g,446747
160
- modal_proto/api_pb2_grpc.py,sha256=NQPpAa3Co-zFNB6L6BQoZjf-RaOlWFFPX8chQyGHQEo,242401
161
- modal_proto/api_pb2_grpc.pyi,sha256=zK2Ms2Xws02cC9uy5U5A5sPULXx4T6A9o9BONqFcipg,56456
162
- modal_proto/modal_api_grpc.py,sha256=K_GsrHIw2CayKh_nyuYAblQW_tOijUNW267Hs9vWUWU,14948
156
+ modal_proto/api.proto,sha256=eD4A8icYJFeunpUiDqra14EmUnosttBtDnrrfdxGeBw,93783
157
+ modal_proto/api_grpc.py,sha256=LZ_rylBFJ79c5-dYOcyebPjRGrCKNO3j2K7giw9P9-g,113653
158
+ modal_proto/api_pb2.py,sha256=NEV1ZmTOfpBuCgJ4F6eSZKQkBHXPaHowdJtCs0OCek0,330916
159
+ modal_proto/api_pb2.pyi,sha256=JP8s6JHac1Cz2kpJaBNk6K_bPoel1j50uJYco6lV7Co,450054
160
+ modal_proto/api_pb2_grpc.py,sha256=QaApxS-KExaYpQU0kdnoxXPrERZk_b4lRZKY_V4mbq0,245789
161
+ modal_proto/api_pb2_grpc.pyi,sha256=6obh-mFStQnsXcUHzTI_SXuED9mhwcKnfIt_urSZkJw,57552
162
+ modal_proto/modal_api_grpc.py,sha256=r7qGJdW69v5pXca2ySm6gqTGYG_pFPWBno_4XGMkbpU,15136
163
163
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
164
164
  modal_proto/options.proto,sha256=zp9h5r61ivsp0XwEWwNBsVqNTbRA1VSY_UtN7sEcHtE,549
165
165
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -170,9 +170,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
170
170
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  modal_version/__init__.py,sha256=m94xZNWIjH8oUtJk4l9xfovzDJede2o7X-q0MHVECtM,470
172
172
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
173
- modal_version/_version_generated.py,sha256=uuUINVrRoOHnG0345kZM29EhW_7y0-WJxEmNLI4sO_Q,149
174
- modal-0.74.14.dist-info/METADATA,sha256=o3yU8T6X_kHWR581mpmsux-kk2_QtQGrGqNL7Kct9jU,2474
175
- modal-0.74.14.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
- modal-0.74.14.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
- modal-0.74.14.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
- modal-0.74.14.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=iw6S4gIMMk_kxXdUThejt0bL01XM4XObW5lyo2KKxMA,149
174
+ modal-0.74.16.dist-info/METADATA,sha256=SOCGPNZKh82g8EnIIGaDKd-PefSR4ucoYk5mS7JCyoE,2474
175
+ modal-0.74.16.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
+ modal-0.74.16.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
+ modal-0.74.16.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
+ modal-0.74.16.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -574,6 +574,27 @@ message Asgi {
574
574
  }
575
575
  }
576
576
 
577
+ message AttemptAwaitRequest {
578
+ string attempt_token = 1;
579
+ double requested_at = 2; // Used for waypoints.
580
+ float timeout_secs = 3;
581
+ }
582
+
583
+ message AttemptAwaitResponse {
584
+ optional FunctionGetOutputsItem output = 1;
585
+ }
586
+
587
+ message AttemptStartRequest {
588
+ string function_id = 1;
589
+ string parent_input_id = 2;
590
+ FunctionPutInputsItem input = 3;
591
+ }
592
+
593
+ message AttemptStartResponse {
594
+ string attempt_token = 1;
595
+ FunctionRetryPolicy retry_policy = 2;
596
+ }
597
+
577
598
  message AutoscalerSettings {
578
599
  // A collection of user-configurable settings for Function autoscaling
579
600
  // These are used for static configuration and for dynamic autoscaler updates
@@ -3085,6 +3106,12 @@ service ModalClient {
3085
3106
  rpc AppSetObjects(AppSetObjectsRequest) returns (google.protobuf.Empty);
3086
3107
  rpc AppStop(AppStopRequest) returns (google.protobuf.Empty);
3087
3108
 
3109
+ // Input Plane
3110
+ // These RPCs are experimental, not deployed to production, and can be changed / removed
3111
+ // without needing to worry about backwards compatibility.
3112
+ rpc AttemptAwait(AttemptAwaitRequest) returns (AttemptAwaitResponse);
3113
+ rpc AttemptStart(AttemptStartRequest) returns (AttemptStartResponse);
3114
+
3088
3115
  // Blobs
3089
3116
  rpc BlobCreate(BlobCreateRequest) returns (BlobCreateResponse);
3090
3117
  rpc BlobGet(BlobGetRequest) returns (BlobGetResponse);
modal_proto/api_grpc.py CHANGED
@@ -82,6 +82,14 @@ class ModalClientBase(abc.ABC):
82
82
  async def AppStop(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppStopRequest, google.protobuf.empty_pb2.Empty]') -> None:
83
83
  pass
84
84
 
85
+ @abc.abstractmethod
86
+ async def AttemptAwait(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AttemptAwaitRequest, modal_proto.api_pb2.AttemptAwaitResponse]') -> None:
87
+ pass
88
+
89
+ @abc.abstractmethod
90
+ async def AttemptStart(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AttemptStartRequest, modal_proto.api_pb2.AttemptStartResponse]') -> None:
91
+ pass
92
+
85
93
  @abc.abstractmethod
86
94
  async def BlobCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.BlobCreateRequest, modal_proto.api_pb2.BlobCreateResponse]') -> None:
87
95
  pass
@@ -700,6 +708,18 @@ class ModalClientBase(abc.ABC):
700
708
  modal_proto.api_pb2.AppStopRequest,
701
709
  google.protobuf.empty_pb2.Empty,
702
710
  ),
711
+ '/modal.client.ModalClient/AttemptAwait': grpclib.const.Handler(
712
+ self.AttemptAwait,
713
+ grpclib.const.Cardinality.UNARY_UNARY,
714
+ modal_proto.api_pb2.AttemptAwaitRequest,
715
+ modal_proto.api_pb2.AttemptAwaitResponse,
716
+ ),
717
+ '/modal.client.ModalClient/AttemptStart': grpclib.const.Handler(
718
+ self.AttemptStart,
719
+ grpclib.const.Cardinality.UNARY_UNARY,
720
+ modal_proto.api_pb2.AttemptStartRequest,
721
+ modal_proto.api_pb2.AttemptStartResponse,
722
+ ),
703
723
  '/modal.client.ModalClient/BlobCreate': grpclib.const.Handler(
704
724
  self.BlobCreate,
705
725
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1582,6 +1602,18 @@ class ModalClientStub:
1582
1602
  modal_proto.api_pb2.AppStopRequest,
1583
1603
  google.protobuf.empty_pb2.Empty,
1584
1604
  )
1605
+ self.AttemptAwait = grpclib.client.UnaryUnaryMethod(
1606
+ channel,
1607
+ '/modal.client.ModalClient/AttemptAwait',
1608
+ modal_proto.api_pb2.AttemptAwaitRequest,
1609
+ modal_proto.api_pb2.AttemptAwaitResponse,
1610
+ )
1611
+ self.AttemptStart = grpclib.client.UnaryUnaryMethod(
1612
+ channel,
1613
+ '/modal.client.ModalClient/AttemptStart',
1614
+ modal_proto.api_pb2.AttemptStartRequest,
1615
+ modal_proto.api_pb2.AttemptStartResponse,
1616
+ )
1585
1617
  self.BlobCreate = grpclib.client.UnaryUnaryMethod(
1586
1618
  channel,
1587
1619
  '/modal.client.ModalClient/BlobCreate',