modal 1.1.1.dev27__py3-none-any.whl → 1.1.1.dev29__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

modal/secret.pyi CHANGED
@@ -1,9 +1,33 @@
1
+ import datetime
2
+ import google.protobuf.message
1
3
  import modal._object
2
4
  import modal.client
3
5
  import modal.object
6
+ import modal_proto.api_pb2
4
7
  import typing
5
8
  import typing_extensions
6
9
 
10
+ class SecretInfo:
11
+ """Information about the Secret object."""
12
+
13
+ name: typing.Optional[str]
14
+ created_at: datetime.datetime
15
+ created_by: typing.Optional[str]
16
+
17
+ def __init__(
18
+ self, name: typing.Optional[str], created_at: datetime.datetime, created_by: typing.Optional[str]
19
+ ) -> None:
20
+ """Initialize self. See help(type(self)) for accurate signature."""
21
+ ...
22
+
23
+ def __repr__(self):
24
+ """Return repr(self)."""
25
+ ...
26
+
27
+ def __eq__(self, other):
28
+ """Return self==value."""
29
+ ...
30
+
7
31
  class _Secret(modal._object._Object):
8
32
  """Secrets provide a dictionary of environment variables for images.
9
33
 
@@ -13,6 +37,13 @@ class _Secret(modal._object._Object):
13
37
 
14
38
  See [the secrets guide page](https://modal.com/docs/guide/secrets) for more information.
15
39
  """
40
+
41
+ _metadata: typing.Optional[modal_proto.api_pb2.SecretMetadata]
42
+
43
+ @property
44
+ def name(self) -> typing.Optional[str]: ...
45
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
46
+ def _get_metadata(self) -> modal_proto.api_pb2.SecretMetadata: ...
16
47
  @staticmethod
17
48
  def from_dict(env_dict: dict[str, typing.Optional[str]] = {}) -> _Secret:
18
49
  """Create a secret from a str-str dictionary. Values can also be `None`, which is ignored.
@@ -104,6 +135,12 @@ class _Secret(modal._object._Object):
104
135
  """mdmd:hidden"""
105
136
  ...
106
137
 
138
+ async def info(self) -> SecretInfo:
139
+ """Return information about the Secret object."""
140
+ ...
141
+
142
+ SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
143
+
107
144
  class Secret(modal.object.Object):
108
145
  """Secrets provide a dictionary of environment variables for images.
109
146
 
@@ -113,10 +150,17 @@ class Secret(modal.object.Object):
113
150
 
114
151
  See [the secrets guide page](https://modal.com/docs/guide/secrets) for more information.
115
152
  """
153
+
154
+ _metadata: typing.Optional[modal_proto.api_pb2.SecretMetadata]
155
+
116
156
  def __init__(self, *args, **kwargs):
117
157
  """mdmd:hidden"""
118
158
  ...
119
159
 
160
+ @property
161
+ def name(self) -> typing.Optional[str]: ...
162
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
163
+ def _get_metadata(self) -> modal_proto.api_pb2.SecretMetadata: ...
120
164
  @staticmethod
121
165
  def from_dict(env_dict: dict[str, typing.Optional[str]] = {}) -> Secret:
122
166
  """Create a secret from a str-str dictionary. Values can also be `None`, which is ignored.
@@ -240,3 +284,14 @@ class Secret(modal.object.Object):
240
284
  ...
241
285
 
242
286
  create_deployed: __create_deployed_spec
287
+
288
+ class __info_spec(typing_extensions.Protocol[SUPERSELF]):
289
+ def __call__(self, /) -> SecretInfo:
290
+ """Return information about the Secret object."""
291
+ ...
292
+
293
+ async def aio(self, /) -> SecretInfo:
294
+ """Return information about the Secret object."""
295
+ ...
296
+
297
+ info: __info_spec[typing_extensions.Self]
modal/volume.py CHANGED
@@ -11,6 +11,7 @@ import time
11
11
  import typing
12
12
  from collections.abc import AsyncGenerator, AsyncIterator, Generator, Sequence
13
13
  from dataclasses import dataclass
14
+ from datetime import datetime
14
15
  from io import BytesIO
15
16
  from pathlib import Path, PurePosixPath
16
17
  from typing import (
@@ -92,6 +93,18 @@ class FileEntry:
92
93
  )
93
94
 
94
95
 
96
+ @dataclass
97
+ class VolumeInfo:
98
+ """Information about the Volume object."""
99
+
100
+ # This dataclass should be limited to information that is unchanging over the lifetime of the Volume,
101
+ # since it is transmitted from the server when the object is hydrated and could be stale when accessed.
102
+
103
+ name: Optional[str]
104
+ created_at: datetime
105
+ created_by: Optional[str]
106
+
107
+
95
108
  class _Volume(_Object, type_prefix="vo"):
96
109
  """A writeable volume that can be used to share files between one or more Modal functions.
97
110
 
@@ -167,6 +180,19 @@ class _Volume(_Object, type_prefix="vo"):
167
180
  obj = _Volume._from_loader(_load, "Volume()", hydrate_lazily=True, deps=lambda: [self])
168
181
  return obj
169
182
 
183
+ @property
184
+ def name(self) -> Optional[str]:
185
+ return self._name
186
+
187
+ def _hydrate_metadata(self, metadata: Optional[Message]):
188
+ if metadata:
189
+ assert isinstance(metadata, api_pb2.VolumeMetadata)
190
+ self._metadata = metadata
191
+ self._name = metadata.name
192
+
193
+ def _get_metadata(self) -> Optional[Message]:
194
+ return self._metadata
195
+
170
196
  async def _get_lock(self):
171
197
  # To (mostly*) prevent multiple concurrent operations on the same volume, which can cause problems under
172
198
  # some unlikely circumstances.
@@ -181,6 +207,14 @@ class _Volume(_Object, type_prefix="vo"):
181
207
  self._lock = asyncio.Lock()
182
208
  return self._lock
183
209
 
210
+ @property
211
+ def _is_v1(self) -> bool:
212
+ return self._metadata.version in [
213
+ None,
214
+ api_pb2.VolumeFsVersion.VOLUME_FS_VERSION_UNSPECIFIED,
215
+ api_pb2.VolumeFsVersion.VOLUME_FS_VERSION_V1,
216
+ ]
217
+
184
218
  @staticmethod
185
219
  def from_name(
186
220
  name: str,
@@ -220,24 +254,7 @@ class _Volume(_Object, type_prefix="vo"):
220
254
  response = await resolver.client.stub.VolumeGetOrCreate(req)
221
255
  self._hydrate(response.volume_id, resolver.client, response.metadata)
222
256
 
223
- return _Volume._from_loader(_load, "Volume()", hydrate_lazily=True)
224
-
225
- def _hydrate_metadata(self, metadata: Optional[Message]):
226
- if metadata and isinstance(metadata, api_pb2.VolumeMetadata):
227
- self._metadata = metadata
228
- else:
229
- raise TypeError("_hydrate_metadata() requires an `api_pb2.VolumeMetadata` to determine volume version")
230
-
231
- def _get_metadata(self) -> Optional[Message]:
232
- return self._metadata
233
-
234
- @property
235
- def _is_v1(self) -> bool:
236
- return self._metadata.version in [
237
- None,
238
- api_pb2.VolumeFsVersion.VOLUME_FS_VERSION_UNSPECIFIED,
239
- api_pb2.VolumeFsVersion.VOLUME_FS_VERSION_V1,
240
- ]
257
+ return _Volume._from_loader(_load, "Volume()", hydrate_lazily=True, name=name)
241
258
 
242
259
  @classmethod
243
260
  @asynccontextmanager
@@ -338,6 +355,19 @@ class _Volume(_Object, type_prefix="vo"):
338
355
  resp = await retry_transient_errors(client.stub.VolumeGetOrCreate, request)
339
356
  return resp.volume_id
340
357
 
358
+ @live_method
359
+ async def info(self) -> VolumeInfo:
360
+ """Return information about the Volume object."""
361
+ metadata = self._get_metadata()
362
+ if not metadata:
363
+ return VolumeInfo()
364
+ creation_info = metadata.creation_info
365
+ return VolumeInfo(
366
+ name=metadata.name or None,
367
+ created_at=datetime.fromtimestamp(creation_info.created_at) if creation_info.created_at else None,
368
+ created_by=creation_info.created_by or None,
369
+ )
370
+
341
371
  @live_method
342
372
  async def _do_reload(self, lock=True):
343
373
  async with (await self._get_lock()) if lock else asyncnullcontext():
modal/volume.pyi CHANGED
@@ -1,6 +1,7 @@
1
1
  import _io
2
2
  import asyncio.locks
3
3
  import collections.abc
4
+ import datetime
4
5
  import enum
5
6
  import google.protobuf.message
6
7
  import modal._object
@@ -57,6 +58,27 @@ class FileEntry:
57
58
  """Return hash(self)."""
58
59
  ...
59
60
 
61
+ class VolumeInfo:
62
+ """Information about the Volume object."""
63
+
64
+ name: typing.Optional[str]
65
+ created_at: datetime.datetime
66
+ created_by: typing.Optional[str]
67
+
68
+ def __init__(
69
+ self, name: typing.Optional[str], created_at: datetime.datetime, created_by: typing.Optional[str]
70
+ ) -> None:
71
+ """Initialize self. See help(type(self)) for accurate signature."""
72
+ ...
73
+
74
+ def __repr__(self):
75
+ """Return repr(self)."""
76
+ ...
77
+
78
+ def __eq__(self, other):
79
+ """Return self==value."""
80
+ ...
81
+
60
82
  class _Volume(modal._object._Object):
61
83
  """A writeable volume that can be used to share files between one or more Modal functions.
62
84
 
@@ -126,7 +148,13 @@ class _Volume(modal._object._Object):
126
148
  """
127
149
  ...
128
150
 
151
+ @property
152
+ def name(self) -> typing.Optional[str]: ...
153
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
154
+ def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
129
155
  async def _get_lock(self): ...
156
+ @property
157
+ def _is_v1(self) -> bool: ...
130
158
  @staticmethod
131
159
  def from_name(
132
160
  name: str,
@@ -155,10 +183,6 @@ class _Volume(modal._object._Object):
155
183
  """
156
184
  ...
157
185
 
158
- def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
159
- def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
160
- @property
161
- def _is_v1(self) -> bool: ...
162
186
  @classmethod
163
187
  def ephemeral(
164
188
  cls: type[_Volume],
@@ -218,6 +242,10 @@ class _Volume(modal._object._Object):
218
242
  """mdmd:hidden"""
219
243
  ...
220
244
 
245
+ async def info(self) -> VolumeInfo:
246
+ """Return information about the Volume object."""
247
+ ...
248
+
221
249
  async def _do_reload(self, lock=True): ...
222
250
  async def commit(self):
223
251
  """Commit changes to the volume.
@@ -424,12 +452,19 @@ class Volume(modal.object.Object):
424
452
  """
425
453
  ...
426
454
 
455
+ @property
456
+ def name(self) -> typing.Optional[str]: ...
457
+ def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
458
+ def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
459
+
427
460
  class ___get_lock_spec(typing_extensions.Protocol[SUPERSELF]):
428
461
  def __call__(self, /): ...
429
462
  async def aio(self, /): ...
430
463
 
431
464
  _get_lock: ___get_lock_spec[typing_extensions.Self]
432
465
 
466
+ @property
467
+ def _is_v1(self) -> bool: ...
433
468
  @staticmethod
434
469
  def from_name(
435
470
  name: str,
@@ -458,10 +493,6 @@ class Volume(modal.object.Object):
458
493
  """
459
494
  ...
460
495
 
461
- def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
462
- def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
463
- @property
464
- def _is_v1(self) -> bool: ...
465
496
  @classmethod
466
497
  def ephemeral(
467
498
  cls: type[Volume],
@@ -566,6 +597,17 @@ class Volume(modal.object.Object):
566
597
 
567
598
  create_deployed: __create_deployed_spec
568
599
 
600
+ class __info_spec(typing_extensions.Protocol[SUPERSELF]):
601
+ def __call__(self, /) -> VolumeInfo:
602
+ """Return information about the Volume object."""
603
+ ...
604
+
605
+ async def aio(self, /) -> VolumeInfo:
606
+ """Return information about the Volume object."""
607
+ ...
608
+
609
+ info: __info_spec[typing_extensions.Self]
610
+
569
611
  class ___do_reload_spec(typing_extensions.Protocol[SUPERSELF]):
570
612
  def __call__(self, /, lock=True): ...
571
613
  async def aio(self, /, lock=True): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev27
3
+ Version: 1.1.1.dev29
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -6,7 +6,7 @@ modal/_container_entrypoint.py,sha256=1qBMNY_E9ICC_sRCtillMxmKPsmxJl1J0_qOAG8rH-
6
6
  modal/_functions.py,sha256=c1EeAcHcYP76wHbLomV0mFe73AoL-TUSjJNSDu6CELI,83065
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
- modal/_object.py,sha256=vzRWhAcFJDM8ZmiUSDgSj9gJhLZJA-wjLVvTl984N4A,11295
9
+ modal/_object.py,sha256=nCkQeLibSuvVAEIheGaLnUfN5PIh1CGpJCnzPIXymGY,11563
10
10
  modal/_output.py,sha256=T7CRq90W09d-WD4ko7T4PBe26JNeAXE1-8HNO9xpNPI,25787
11
11
  modal/_partial_function.py,sha256=B1J4S9W-La0NHaVmY1aCuH0E3QxJHIX6ZWY5eNTQ7io,37142
12
12
  modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
@@ -22,7 +22,7 @@ modal/app.py,sha256=BBR2NmGzZbFGfhKAmtzllD0o4TbVDBbOEs0O2ysSdQo,48277
22
22
  modal/app.pyi,sha256=h6JtBA6a7wobdZAuS3QuXrWCUZqfyKPuGV3XdjCqT3k,43753
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=wFaJHuUEHBCwmvC7bUrVycYR0ZhiK6KC-20mwWAG61Q,15831
25
+ modal/client.pyi,sha256=c3QfrlaMZvOXOb995cuXSphWbSb0nFokqpJCdAAm0xI,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=7A0xGnugQzm8dOfnKMjLjtqekRlRtQ0jPFRYgq6xdUM,40018
@@ -30,8 +30,8 @@ modal/cls.pyi,sha256=_tZ5qrlL-ZDEcD-mf9BZkkNH5XPr4SmGTEQ-RVmqF3I,27772
30
30
  modal/config.py,sha256=FqVewLPVVR4feq_46JBENiCzqTuXKpnvQZxaeWbS39g,12009
31
31
  modal/container_process.py,sha256=XkPwNIW-iD_GB9u9yqv9q8y-i5cQ8eBbLZZ_GvEw9t8,6858
32
32
  modal/container_process.pyi,sha256=9m-st3hCUlNN1GOTctfPPvIvoLtEl7FbuGWwif5-7YU,6037
33
- modal/dict.py,sha256=YVrIARVfaD2kmdnqbGtneeLciiLkzKxYego0jfkv3Sk,14400
34
- modal/dict.pyi,sha256=gs3J7X5yG3J1L6rW0s3_7yRn8qAfY0f4n5-sqaDZY2g,20853
33
+ modal/dict.py,sha256=IyhKwQPM-HX10ZT-0ouSxpM-oAWqrT5waXFHmunmtyo,15804
34
+ modal/dict.pyi,sha256=vUrNmCKWZqiPIQSdbMT6fCq9q1QV3qkGVdz2B_yld34,22578
35
35
  modal/environments.py,sha256=gHFNLG78bqgizpQ4w_elz27QOqmcgAonFsmLs7NjUJ4,6804
36
36
  modal/environments.pyi,sha256=9-KtrzAcUe55cCP4020lSUD7-fWS7OPakAHssq4-bro,4219
37
37
  modal/exception.py,sha256=o0V93PK8Hcg2YQ2aeOB1Y-qWBw4Gz5ATfyokR8GapuQ,5634
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=BVqAJ0sgPUfN8QsYztWiGB4j56he60TncM02KsylnCw,21449
39
39
  modal/file_io.pyi,sha256=cPT_hsplE5iLCXhYOLn1Sp9eDdk7DxdFmicQHanJZyg,15918
40
40
  modal/file_pattern_matcher.py,sha256=urAue8es8jxqX94k9EYoZxxhtfgOlsEES8lbFHOorzc,7734
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=sht8252nY3f7y20vURdjz4R-NU0_EvHjHVl97PQ1t_4,34823
42
+ modal/functions.pyi,sha256=0P4f8ew79lf0lWXObYmNFxKoUPbWmoT0CD5IqGNKFhE,34823
43
43
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
44
44
  modal/image.py,sha256=G7JrvObATiT29G3JT_-9O4QychpqW_8b8seWXTVd1fs,102635
45
45
  modal/image.pyi,sha256=s_AQaFoWmjLzffJGmiedFf9K1qQkedVIlsC6vRtlKS8,68161
@@ -50,7 +50,7 @@ modal/mount.pyi,sha256=n6AuS8J3bTCQj750nVZZdVBvzCAlSM2fyxAt_5LLFik,20264
50
50
  modal/network_file_system.py,sha256=AdjxI_hCYaDZz60gOuJeig8yourfWhHmEpn13C_fnMA,14775
51
51
  modal/network_file_system.pyi,sha256=Td_IobHr84iLo_9LZKQ4tNdUB60yjX8QWBaFiUvhfi8,17685
52
52
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
53
- modal/object.pyi,sha256=751TV6BntarPsErf0HDQPsvePjWFf0JZK8ZAiRpM1yg,6627
53
+ modal/object.pyi,sha256=sgbaq_d3QSmnPKg5jRbMG3dOceKs0l54kHUAhAyZKAE,6796
54
54
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
55
55
  modal/parallel_map.py,sha256=-9nS9s1jbx1Iqh_5HQRK4xTdhnXF4AGIXwT4UGJ8R78,52666
56
56
  modal/parallel_map.pyi,sha256=fCugFsGup4Cflesb10_uR-nt5_eguuvhvtvavus_F98,11186
@@ -59,8 +59,8 @@ modal/partial_function.pyi,sha256=lqqOzZ9-QvHTDWKQ_oAYYOvsXgTOBKhO9u-RI98JbUk,13
59
59
  modal/proxy.py,sha256=NQJJMGo-D2IfmeU0vb10WWaE4oTLcuf9jTeEJvactOg,1446
60
60
  modal/proxy.pyi,sha256=yWGWwADCRGrC2w81B7671UTH4Uv3HMZKy5vVqlJUZoA,1417
61
61
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- modal/queue.py,sha256=LuOtO5s6Aes-oXgzmIfLvmEF-QtAZdC9LPqSRbqy-X0,18925
63
- modal/queue.pyi,sha256=J6ggmVodMRegDuJE0g7AmOPAoMKbgtfvlBrWaT-T7MA,26657
62
+ modal/queue.py,sha256=19Xri5HzY0VgOxWMZ4y_mNco8jhNgn9klegXrSHWmGc,20306
63
+ modal/queue.pyi,sha256=Pv4OtY7j17Yb89HGKaMQRiIv0yol-aV-ZtelxQ9GrlU,28330
64
64
  modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
65
65
  modal/runner.py,sha256=ostdzYpQb-20tlD6dIq7bpWTkZkOhjJBNuMNektqnJA,24068
66
66
  modal/runner.pyi,sha256=lbwLljm1cC8d6PcNvmYQhkE8501V9fg0bYqqKX6G4r4,8489
@@ -69,8 +69,8 @@ modal/sandbox.py,sha256=_hAoBwParMzooNUo02LRt-nC5RrTGUtOutyO9oI79Kc,40896
69
69
  modal/sandbox.pyi,sha256=GPPlsm-DiSUSgrxyA5bqkpuLlrfgmNR7Z7s3W0QLuQ0,41812
70
70
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
71
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
72
- modal/secret.py,sha256=rzqPd2kT1FoN_R1_nstso3ZLhkRf7iK-fRWhaUBwP6M,10577
73
- modal/secret.pyi,sha256=_d_vvgIZY-FCMKJheBOn01DQGEvyzB_Rfw5K1hGEaXU,7990
72
+ modal/secret.py,sha256=UaUmwYmT52VarDh92b0QzAa8_BNUAgBs-wE4eMQ6-B8,11967
73
+ modal/secret.pyi,sha256=zcC_OM0JzIF1ccnhNvVIlL6sY3xVjq3t0s3fE1ZDDVs,9732
74
74
  modal/serving.py,sha256=3I3WBeVbzZY258u9PXBCW_dZBgypq3OhwBuTVvlgubE,4423
75
75
  modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
76
76
  modal/snapshot.py,sha256=E3oxYQkYVRB_LeFBfmUV1Y6vHz8-azXJfC4x7A1QKnI,1455
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
78
78
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
79
79
  modal/token_flow.py,sha256=GWpar0gANs71vm9Bd_Cj87UG1K3ljTURbkEjG3JLsrY,7616
80
80
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
81
- modal/volume.py,sha256=aIGp_ZFD6UUqM2XnS19GBqWLc1_xOVBIx2JcFn30aYk,44475
82
- modal/volume.pyi,sha256=Qo5D0Bojcp8J4t4OoRArrBFaC1MSvFf9jQIL9U6Qz2Q,40779
81
+ modal/volume.py,sha256=b3VYD-0D8rZWxoeIIYpjqm2lgxrVOjFEgTyW2btUVnw,45396
82
+ modal/volume.pyi,sha256=lMXzeyeC85ji8g2j0Ghy1WQrk2A2J0LPVpLFpabbr6A,41933
83
83
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
84
84
  modal/_runtime/asgi.py,sha256=_2xSTsDD27Cit7xnMs4lzkJA2wzer2_N4Oa3BkXFzVA,22521
85
85
  modal/_runtime/container_io_manager.py,sha256=hjkK4gke_A8_mULSfm3F1hZKR0C61lKbRUI8mHS-LGE,45464
@@ -151,7 +151,7 @@ modal/experimental/__init__.py,sha256=nuc7AL4r_Fs08DD5dciWFZhrV1nanwoClOfdTcudU0
151
151
  modal/experimental/flash.py,sha256=7-_RBNvm0tEpdxXWuPAj5HCxfN-hSHVBep8SEWgAhCQ,19721
152
152
  modal/experimental/flash.pyi,sha256=A8_qJGtGoXEzKDdHbvhmCw7oqfneFEvJQK3ZdTOvUdU,10830
153
153
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
154
- modal-1.1.1.dev27.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
154
+ modal-1.1.1.dev29.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
155
155
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
156
156
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
157
157
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -159,13 +159,13 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
159
159
  modal_docs/mdmd/mdmd.py,sha256=eW5MzrEl7mSclDo4Uv64sQ1-4IyLggldbgUJdBVLDdI,6449
160
160
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
161
161
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
162
- modal_proto/api.proto,sha256=rpL3kteIlLwOqc_SJRV8I5Wf6PN-53gDIwbTqqccwyU,102706
163
- modal_proto/api_grpc.py,sha256=WpGSvMcnGElrDaSQWmVV1XsyLNoJQ7DMbOTX_1mh554,124648
164
- modal_proto/api_pb2.py,sha256=aGfM5udyJQzQWQfAvBKuCFO9zsseBHs1SqGaD09CXYM,360228
165
- modal_proto/api_pb2.pyi,sha256=7u2jVaZAf1vuEK0Asf-5ZI4CXK8Fc2kNsT3cbdGDSVg,494777
166
- modal_proto/api_pb2_grpc.py,sha256=VODlpmFdVjW7Sdo1FENf4vxktCmlmtijz5NryNIsQsc,269266
167
- modal_proto/api_pb2_grpc.pyi,sha256=QIQgbnAmRvRQTZS-euu_KsPKRHD2z3XRlHFHnOY2mtw,63139
168
- modal_proto/modal_api_grpc.py,sha256=0VKviuGtr-LV5-EMCkSSkmF9JivXkmWFZaCyFpMzSl8,18813
162
+ modal_proto/api.proto,sha256=3mqurCFq_Up0dPjsdMqv9pAltDPtveZUoMFOErSMCiE,103299
163
+ modal_proto/api_grpc.py,sha256=B8F07AbQT5s3sCEE_o-MHGwK2lqA3gdnLb_6oTWoIj8,126393
164
+ modal_proto/api_pb2.py,sha256=8MBFdVp0ZwmYtcB-AXAZjo1T0p4NdaXFRtyk3-T5go4,363407
165
+ modal_proto/api_pb2.pyi,sha256=BzL_rKxmq5nDCD8r9vBc3zmBm_EqesP0Ugag-jk-HpM,497475
166
+ modal_proto/api_pb2_grpc.py,sha256=gig1H1894_rLO9C5cYUwbX-JONt6nSpJenjfiFy3ZHk,272831
167
+ modal_proto/api_pb2_grpc.pyi,sha256=kXE43WnhqwacvJ_HB7L-hIBGg0djP3rX4lSliJN49NE,64007
168
+ modal_proto/modal_api_grpc.py,sha256=KL5Nw4AS9hJNxfL6VIeuxHz4jIUN7Unz7hYnoSsqyx0,19071
169
169
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
170
170
  modal_proto/options.proto,sha256=zp9h5r61ivsp0XwEWwNBsVqNTbRA1VSY_UtN7sEcHtE,549
171
171
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -174,10 +174,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
174
174
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
175
175
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
176
176
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- modal_version/__init__.py,sha256=m2l1Ux0zEmfAlzJi5bl7t9TGPTtYDBNsqxB9ubT73-Y,121
177
+ modal_version/__init__.py,sha256=AVZRY8iMIyJQL2q8Pe8LkP5d2-Bp_49PrvuHJk9SfZ0,121
178
178
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
179
- modal-1.1.1.dev27.dist-info/METADATA,sha256=rU5LvmpLd-OflbXOoKwSLzdeyZYns0nzGYTUwWPwQ1c,2460
180
- modal-1.1.1.dev27.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
181
- modal-1.1.1.dev27.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
182
- modal-1.1.1.dev27.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
183
- modal-1.1.1.dev27.dist-info/RECORD,,
179
+ modal-1.1.1.dev29.dist-info/METADATA,sha256=xa7qid04j0zY5Siso5kqg494y8ZqN_iZXJGHocsxZVI,2460
180
+ modal-1.1.1.dev29.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
181
+ modal-1.1.1.dev29.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
182
+ modal-1.1.1.dev29.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
183
+ modal-1.1.1.dev29.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -2699,6 +2699,26 @@ message SandboxRestoreResponse {
2699
2699
  string sandbox_id = 1;
2700
2700
  }
2701
2701
 
2702
+ message SandboxSnapshotFsAsyncGetRequest {
2703
+ string image_id = 1;
2704
+ float timeout = 2;
2705
+ }
2706
+
2707
+ message SandboxSnapshotFsAsyncGetResponse {
2708
+ string image_id = 1;
2709
+ GenericResult result = 2;
2710
+ ImageMetadata image_metadata = 3;
2711
+ }
2712
+
2713
+ message SandboxSnapshotFsAsyncRequest {
2714
+ string sandbox_id = 1;
2715
+ float timeout = 2;
2716
+ }
2717
+
2718
+ message SandboxSnapshotFsAsyncResponse {
2719
+ string image_id = 1;
2720
+ }
2721
+
2702
2722
  message SandboxSnapshotFsRequest {
2703
2723
  string sandbox_id = 1;
2704
2724
  float timeout = 2;
@@ -3523,6 +3543,8 @@ service ModalClient {
3523
3543
  rpc SandboxRestore(SandboxRestoreRequest) returns (SandboxRestoreResponse);
3524
3544
  rpc SandboxSnapshot(SandboxSnapshotRequest) returns (SandboxSnapshotResponse);
3525
3545
  rpc SandboxSnapshotFs(SandboxSnapshotFsRequest) returns (SandboxSnapshotFsResponse);
3546
+ rpc SandboxSnapshotFsAsync(SandboxSnapshotFsAsyncRequest) returns (SandboxSnapshotFsAsyncResponse);
3547
+ rpc SandboxSnapshotFsAsyncGet(SandboxSnapshotFsAsyncGetRequest) returns (SandboxSnapshotFsAsyncGetResponse);
3526
3548
  rpc SandboxSnapshotGet(SandboxSnapshotGetRequest) returns (SandboxSnapshotGetResponse);
3527
3549
  rpc SandboxSnapshotWait(SandboxSnapshotWaitRequest) returns (SandboxSnapshotWaitResponse);
3528
3550
  rpc SandboxStdinWrite(SandboxStdinWriteRequest) returns (SandboxStdinWriteResponse);
modal_proto/api_grpc.py CHANGED
@@ -490,6 +490,14 @@ class ModalClientBase(abc.ABC):
490
490
  async def SandboxSnapshotFs(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSnapshotFsRequest, modal_proto.api_pb2.SandboxSnapshotFsResponse]') -> None:
491
491
  pass
492
492
 
493
+ @abc.abstractmethod
494
+ async def SandboxSnapshotFsAsync(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSnapshotFsAsyncRequest, modal_proto.api_pb2.SandboxSnapshotFsAsyncResponse]') -> None:
495
+ pass
496
+
497
+ @abc.abstractmethod
498
+ async def SandboxSnapshotFsAsyncGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSnapshotFsAsyncGetRequest, modal_proto.api_pb2.SandboxSnapshotFsAsyncGetResponse]') -> None:
499
+ pass
500
+
493
501
  @abc.abstractmethod
494
502
  async def SandboxSnapshotGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSnapshotGetRequest, modal_proto.api_pb2.SandboxSnapshotGetResponse]') -> None:
495
503
  pass
@@ -1376,6 +1384,18 @@ class ModalClientBase(abc.ABC):
1376
1384
  modal_proto.api_pb2.SandboxSnapshotFsRequest,
1377
1385
  modal_proto.api_pb2.SandboxSnapshotFsResponse,
1378
1386
  ),
1387
+ '/modal.client.ModalClient/SandboxSnapshotFsAsync': grpclib.const.Handler(
1388
+ self.SandboxSnapshotFsAsync,
1389
+ grpclib.const.Cardinality.UNARY_UNARY,
1390
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncRequest,
1391
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncResponse,
1392
+ ),
1393
+ '/modal.client.ModalClient/SandboxSnapshotFsAsyncGet': grpclib.const.Handler(
1394
+ self.SandboxSnapshotFsAsyncGet,
1395
+ grpclib.const.Cardinality.UNARY_UNARY,
1396
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncGetRequest,
1397
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncGetResponse,
1398
+ ),
1379
1399
  '/modal.client.ModalClient/SandboxSnapshotGet': grpclib.const.Handler(
1380
1400
  self.SandboxSnapshotGet,
1381
1401
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2354,6 +2374,18 @@ class ModalClientStub:
2354
2374
  modal_proto.api_pb2.SandboxSnapshotFsRequest,
2355
2375
  modal_proto.api_pb2.SandboxSnapshotFsResponse,
2356
2376
  )
2377
+ self.SandboxSnapshotFsAsync = grpclib.client.UnaryUnaryMethod(
2378
+ channel,
2379
+ '/modal.client.ModalClient/SandboxSnapshotFsAsync',
2380
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncRequest,
2381
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncResponse,
2382
+ )
2383
+ self.SandboxSnapshotFsAsyncGet = grpclib.client.UnaryUnaryMethod(
2384
+ channel,
2385
+ '/modal.client.ModalClient/SandboxSnapshotFsAsyncGet',
2386
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncGetRequest,
2387
+ modal_proto.api_pb2.SandboxSnapshotFsAsyncGetResponse,
2388
+ )
2357
2389
  self.SandboxSnapshotGet = grpclib.client.UnaryUnaryMethod(
2358
2390
  channel,
2359
2391
  '/modal.client.ModalClient/SandboxSnapshotGet',