modal 1.2.2.dev22__py3-none-any.whl → 1.2.2.dev31__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.
Files changed (52) hide show
  1. modal/_functions.py +69 -37
  2. modal/_grpc_client.py +25 -2
  3. modal/_load_context.py +105 -0
  4. modal/_object.py +47 -18
  5. modal/_resolver.py +21 -35
  6. modal/_utils/function_utils.py +1 -2
  7. modal/app.py +7 -0
  8. modal/app.pyi +3 -0
  9. modal/cli/dict.py +5 -2
  10. modal/cli/queues.py +4 -2
  11. modal/client.pyi +2 -2
  12. modal/cloud_bucket_mount.py +2 -0
  13. modal/cloud_bucket_mount.pyi +4 -0
  14. modal/cls.py +71 -32
  15. modal/cls.pyi +3 -0
  16. modal/dict.py +14 -5
  17. modal/dict.pyi +2 -0
  18. modal/environments.py +16 -7
  19. modal/environments.pyi +6 -2
  20. modal/experimental/flash.py +2 -3
  21. modal/functions.pyi +10 -3
  22. modal/image.py +25 -25
  23. modal/image.pyi +9 -9
  24. modal/mount.py +34 -24
  25. modal/mount.pyi +33 -7
  26. modal/network_file_system.py +14 -5
  27. modal/network_file_system.pyi +12 -2
  28. modal/object.pyi +35 -8
  29. modal/proxy.py +14 -6
  30. modal/proxy.pyi +10 -2
  31. modal/queue.py +14 -5
  32. modal/queue.pyi +12 -2
  33. modal/runner.py +54 -50
  34. modal/runner.pyi +4 -3
  35. modal/sandbox.py +21 -12
  36. modal/secret.py +34 -17
  37. modal/secret.pyi +12 -2
  38. modal/serving.py +7 -11
  39. modal/serving.pyi +7 -8
  40. modal/snapshot.py +11 -5
  41. modal/volume.py +25 -7
  42. modal/volume.pyi +2 -0
  43. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/METADATA +2 -2
  44. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/RECORD +52 -51
  45. modal_proto/api.proto +10 -0
  46. modal_proto/api_pb2.py +841 -838
  47. modal_proto/api_pb2.pyi +25 -2
  48. modal_version/__init__.py +1 -1
  49. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/WHEEL +0 -0
  50. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/entry_points.txt +0 -0
  51. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/licenses/LICENSE +0 -0
  52. {modal-1.2.2.dev22.dist-info → modal-1.2.2.dev31.dist-info}/top_level.txt +0 -0
modal/secret.py CHANGED
@@ -10,6 +10,7 @@ from synchronicity import classproperty
10
10
 
11
11
  from modal_proto import api_pb2
12
12
 
13
+ from ._load_context import LoadContext
13
14
  from ._object import _get_environment_name, _Object, live_method
14
15
  from ._resolver import Resolver
15
16
  from ._runtime.execution_context import is_local
@@ -259,8 +260,10 @@ class _Secret(_Object, type_prefix="st"):
259
260
  if not all(isinstance(v, str) for v in env_dict_filtered.values()):
260
261
  raise InvalidError(ENV_DICT_WRONG_TYPE_ERR)
261
262
 
262
- async def _load(self: _Secret, resolver: Resolver, existing_object_id: Optional[str]):
263
- if resolver.app_id is not None:
263
+ async def _load(
264
+ self: _Secret, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
265
+ ):
266
+ if load_context.app_id is not None:
264
267
  object_creation_type = api_pb2.OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP
265
268
  else:
266
269
  object_creation_type = api_pb2.OBJECT_CREATION_TYPE_EPHEMERAL
@@ -268,21 +271,22 @@ class _Secret(_Object, type_prefix="st"):
268
271
  req = api_pb2.SecretGetOrCreateRequest(
269
272
  object_creation_type=object_creation_type,
270
273
  env_dict=env_dict_filtered,
271
- app_id=resolver.app_id,
272
- environment_name=resolver.environment_name,
274
+ app_id=load_context.app_id,
275
+ environment_name=load_context.environment_name,
273
276
  )
274
277
  try:
275
- resp = await resolver.client.stub.SecretGetOrCreate(req)
278
+ resp = await load_context.client.stub.SecretGetOrCreate(req)
276
279
  except GRPCError as exc:
277
280
  if exc.status == Status.INVALID_ARGUMENT:
278
281
  raise InvalidError(exc.message)
279
282
  if exc.status == Status.FAILED_PRECONDITION:
280
283
  raise InvalidError(exc.message)
281
284
  raise
282
- self._hydrate(resp.secret_id, resolver.client, resp.metadata)
285
+ self._hydrate(resp.secret_id, load_context.client, resp.metadata)
283
286
 
284
287
  rep = f"Secret.from_dict([{', '.join(env_dict.keys())}])"
285
- return _Secret._from_loader(_load, rep, hydrate_lazily=True)
288
+ # TODO: scoping - these should probably not be lazily hydrated without having an app and/or sandbox association
289
+ return _Secret._from_loader(_load, rep, hydrate_lazily=True, load_context_overrides=LoadContext.empty())
286
290
 
287
291
  @staticmethod
288
292
  def from_local_environ(
@@ -330,7 +334,9 @@ class _Secret(_Object, type_prefix="st"):
330
334
  ```
331
335
  """
332
336
 
333
- async def _load(self: _Secret, resolver: Resolver, existing_object_id: Optional[str]):
337
+ async def _load(
338
+ self: _Secret, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
339
+ ):
334
340
  try:
335
341
  from dotenv import dotenv_values, find_dotenv
336
342
  from dotenv.main import _walk_to_root
@@ -359,13 +365,15 @@ class _Secret(_Object, type_prefix="st"):
359
365
  req = api_pb2.SecretGetOrCreateRequest(
360
366
  object_creation_type=api_pb2.OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP,
361
367
  env_dict=env_dict,
362
- app_id=resolver.app_id,
368
+ app_id=load_context.app_id, # TODO: what if app_id isn't set here (e.g. .hydrate())
363
369
  )
364
- resp = await resolver.client.stub.SecretGetOrCreate(req)
370
+ resp = await load_context.client.stub.SecretGetOrCreate(req)
365
371
 
366
- self._hydrate(resp.secret_id, resolver.client, resp.metadata)
372
+ self._hydrate(resp.secret_id, load_context.client, resp.metadata)
367
373
 
368
- return _Secret._from_loader(_load, "Secret.from_dotenv()", hydrate_lazily=True)
374
+ return _Secret._from_loader(
375
+ _load, "Secret.from_dotenv()", hydrate_lazily=True, load_context_overrides=LoadContext.empty()
376
+ )
369
377
 
370
378
  @staticmethod
371
379
  def from_name(
@@ -376,6 +384,7 @@ class _Secret(_Object, type_prefix="st"):
376
384
  required_keys: list[
377
385
  str
378
386
  ] = [], # Optionally, a list of required environment variables (will be asserted server-side)
387
+ client: Optional[_Client] = None,
379
388
  ) -> "_Secret":
380
389
  """Reference a Secret by its name.
381
390
 
@@ -393,23 +402,31 @@ class _Secret(_Object, type_prefix="st"):
393
402
  """
394
403
  warn_if_passing_namespace(namespace, "modal.Secret.from_name")
395
404
 
396
- async def _load(self: _Secret, resolver: Resolver, existing_object_id: Optional[str]):
405
+ async def _load(
406
+ self: _Secret, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
407
+ ):
397
408
  req = api_pb2.SecretGetOrCreateRequest(
398
409
  deployment_name=name,
399
- environment_name=_get_environment_name(environment_name, resolver),
410
+ environment_name=load_context.environment_name,
400
411
  required_keys=required_keys,
401
412
  )
402
413
  try:
403
- response = await resolver.client.stub.SecretGetOrCreate(req)
414
+ response = await load_context.client.stub.SecretGetOrCreate(req)
404
415
  except GRPCError as exc:
405
416
  if exc.status == Status.NOT_FOUND:
406
417
  raise NotFoundError(exc.message)
407
418
  else:
408
419
  raise
409
- self._hydrate(response.secret_id, resolver.client, response.metadata)
420
+ self._hydrate(response.secret_id, load_context.client, response.metadata)
410
421
 
411
422
  rep = _Secret._repr(name, environment_name)
412
- return _Secret._from_loader(_load, rep, hydrate_lazily=True, name=name)
423
+ return _Secret._from_loader(
424
+ _load,
425
+ rep,
426
+ hydrate_lazily=True,
427
+ name=name,
428
+ load_context_overrides=LoadContext(environment_name=environment_name, client=client),
429
+ )
413
430
 
414
431
  @staticmethod
415
432
  async def create_deployed(
modal/secret.pyi CHANGED
@@ -423,7 +423,12 @@ class _Secret(modal._object._Object):
423
423
 
424
424
  @staticmethod
425
425
  def from_name(
426
- name: str, *, namespace=None, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
426
+ name: str,
427
+ *,
428
+ namespace=None,
429
+ environment_name: typing.Optional[str] = None,
430
+ required_keys: list[str] = [],
431
+ client: typing.Optional[modal.client._Client] = None,
427
432
  ) -> _Secret:
428
433
  """Reference a Secret by its name.
429
434
 
@@ -543,7 +548,12 @@ class Secret(modal.object.Object):
543
548
 
544
549
  @staticmethod
545
550
  def from_name(
546
- name: str, *, namespace=None, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
551
+ name: str,
552
+ *,
553
+ namespace=None,
554
+ environment_name: typing.Optional[str] = None,
555
+ required_keys: list[str] = [],
556
+ client: typing.Optional[modal.client.Client] = None,
547
557
  ) -> Secret:
548
558
  """Reference a Secret by its name.
549
559
 
modal/serving.py CHANGED
@@ -4,13 +4,13 @@ import platform
4
4
  from collections.abc import AsyncGenerator
5
5
  from multiprocessing.context import SpawnProcess
6
6
  from multiprocessing.synchronize import Event
7
- from typing import TYPE_CHECKING, Optional, TypeVar
7
+ from typing import TYPE_CHECKING, Optional
8
8
 
9
9
  from synchronicity.async_wrap import asynccontextmanager
10
10
 
11
11
  from modal._output import OutputManager
12
12
 
13
- from ._utils.async_utils import TaskContext, asyncify, synchronize_api, synchronizer
13
+ from ._utils.async_utils import TaskContext, asyncify, synchronize_api
14
14
  from ._utils.logger import logger
15
15
  from ._watcher import watch
16
16
  from .cli.import_refs import ImportRef, import_app_from_ref
@@ -20,20 +20,16 @@ from .output import _get_output_manager, enable_output
20
20
  from .runner import _run_app, serve_update
21
21
 
22
22
  if TYPE_CHECKING:
23
- from .app import _App
24
- else:
25
- _App = TypeVar("_App")
23
+ import modal.app
26
24
 
27
25
 
28
26
  def _run_serve(
29
27
  import_ref: ImportRef, existing_app_id: str, is_ready: Event, environment_name: str, show_progress: bool
30
28
  ):
31
- # subprocess entrypoint
32
- _app = import_app_from_ref(import_ref, base_cmd="modal serve")
33
- blocking_app = synchronizer._translate_out(_app)
29
+ app = import_app_from_ref(import_ref, base_cmd="modal serve")
34
30
 
35
31
  with enable_output(show_progress=show_progress):
36
- serve_update(blocking_app, existing_app_id, is_ready, environment_name)
32
+ serve_update(app, existing_app_id, is_ready, environment_name)
37
33
 
38
34
 
39
35
  async def _restart_serve(
@@ -97,12 +93,12 @@ async def _run_watch_loop(
97
93
 
98
94
  @asynccontextmanager
99
95
  async def _serve_app(
100
- app: "_App",
96
+ app: "modal.app._App",
101
97
  import_ref: ImportRef,
102
98
  *,
103
99
  _watcher: Optional[AsyncGenerator[set[str], None]] = None, # for testing
104
100
  environment_name: Optional[str] = None,
105
- ) -> AsyncGenerator["_App", None]:
101
+ ) -> AsyncGenerator["modal.app._App", None]:
106
102
  if environment_name is None:
107
103
  environment_name = config.get("environment")
108
104
 
modal/serving.pyi CHANGED
@@ -1,4 +1,5 @@
1
1
  import collections.abc
2
+ import modal.app
2
3
  import modal.cli.import_refs
3
4
  import multiprocessing.context
4
5
  import multiprocessing.synchronize
@@ -6,8 +7,6 @@ import synchronicity.combined_types
6
7
  import typing
7
8
  import typing_extensions
8
9
 
9
- _App = typing.TypeVar("_App")
10
-
11
10
  def _run_serve(
12
11
  import_ref: modal.cli.import_refs.ImportRef,
13
12
  existing_app_id: str,
@@ -27,31 +26,31 @@ async def _run_watch_loop(
27
26
  environment_name: str,
28
27
  ): ...
29
28
  def _serve_app(
30
- app: _App,
29
+ app: modal.app._App,
31
30
  import_ref: modal.cli.import_refs.ImportRef,
32
31
  *,
33
32
  _watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
34
33
  environment_name: typing.Optional[str] = None,
35
- ) -> typing.AsyncContextManager[_App]: ...
34
+ ) -> typing.AsyncContextManager[modal.app._App]: ...
36
35
 
37
36
  class __serve_app_spec(typing_extensions.Protocol):
38
37
  def __call__(
39
38
  self,
40
39
  /,
41
- app: _App,
40
+ app: modal.app.App,
42
41
  import_ref: modal.cli.import_refs.ImportRef,
43
42
  *,
44
43
  _watcher: typing.Optional[typing.Generator[set[str], None, None]] = None,
45
44
  environment_name: typing.Optional[str] = None,
46
- ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[_App]: ...
45
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[modal.app.App]: ...
47
46
  def aio(
48
47
  self,
49
48
  /,
50
- app: _App,
49
+ app: modal.app.App,
51
50
  import_ref: modal.cli.import_refs.ImportRef,
52
51
  *,
53
52
  _watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
54
53
  environment_name: typing.Optional[str] = None,
55
- ) -> typing.AsyncContextManager[_App]: ...
54
+ ) -> typing.AsyncContextManager[modal.app.App]: ...
56
55
 
57
56
  serve_app: __serve_app_spec
modal/snapshot.py CHANGED
@@ -3,6 +3,7 @@ from typing import Optional
3
3
 
4
4
  from modal_proto import api_pb2
5
5
 
6
+ from ._load_context import LoadContext
6
7
  from ._object import _Object
7
8
  from ._resolver import Resolver
8
9
  from ._utils.async_utils import synchronize_api
@@ -23,14 +24,19 @@ class _SandboxSnapshot(_Object, type_prefix="sn"):
23
24
  """
24
25
  Construct a `SandboxSnapshot` object from a sandbox snapshot ID.
25
26
  """
26
- if client is None:
27
- client = await _Client.from_env()
27
+ # TODO: remove this - from_id constructor should not do io:
28
+ client = client or await _Client.from_env()
28
29
 
29
- async def _load(self: _SandboxSnapshot, resolver: Resolver, existing_object_id: Optional[str]):
30
- await client.stub.SandboxSnapshotGet(api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id))
30
+ async def _load(
31
+ self: _SandboxSnapshot, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
32
+ ):
33
+ await load_context.client.stub.SandboxSnapshotGet(
34
+ api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id)
35
+ )
31
36
 
32
37
  rep = "SandboxSnapshot()"
33
- obj = _SandboxSnapshot._from_loader(_load, rep)
38
+ obj = _SandboxSnapshot._from_loader(_load, rep, load_context_overrides=LoadContext(client=client))
39
+ # TODO: should this be a _Object._new_hydrated instead?
34
40
  obj._hydrate(sandbox_snapshot_id, client, None)
35
41
 
36
42
  return obj
modal/volume.py CHANGED
@@ -33,6 +33,7 @@ import modal_proto.api_pb2
33
33
  from modal.exception import AlreadyExistsError, InvalidError, NotFoundError, VolumeUploadTimeoutError
34
34
  from modal_proto import api_pb2
35
35
 
36
+ from ._load_context import LoadContext
36
37
  from ._object import (
37
38
  EPHEMERAL_OBJECT_HEARTBEAT_SLEEP,
38
39
  _get_environment_name,
@@ -362,11 +363,19 @@ class _Volume(_Object, type_prefix="vo"):
362
363
  Added in v1.0.5.
363
364
  """
364
365
 
365
- async def _load(new_volume: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
366
+ async def _load(
367
+ new_volume: _Volume, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
368
+ ):
366
369
  new_volume._initialize_from_other(self)
367
370
  new_volume._read_only = True
368
371
 
369
- obj = _Volume._from_loader(_load, "Volume()", hydrate_lazily=True, deps=lambda: [self])
372
+ obj = _Volume._from_loader(
373
+ _load,
374
+ "Volume()",
375
+ hydrate_lazily=True,
376
+ deps=lambda: [self],
377
+ load_context_overrides=self._load_context_overrides,
378
+ )
370
379
  return obj
371
380
 
372
381
  def _hydrate_metadata(self, metadata: Optional[Message]):
@@ -408,6 +417,7 @@ class _Volume(_Object, type_prefix="vo"):
408
417
  environment_name: Optional[str] = None,
409
418
  create_if_missing: bool = False,
410
419
  version: "typing.Optional[modal_proto.api_pb2.VolumeFsVersion.ValueType]" = None,
420
+ client: Optional[_Client] = None,
411
421
  ) -> "_Volume":
412
422
  """Reference a Volume by name, creating if necessary.
413
423
 
@@ -429,18 +439,26 @@ class _Volume(_Object, type_prefix="vo"):
429
439
  check_object_name(name, "Volume")
430
440
  warn_if_passing_namespace(namespace, "modal.Volume.from_name")
431
441
 
432
- async def _load(self: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
442
+ async def _load(
443
+ self: _Volume, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
444
+ ):
433
445
  req = api_pb2.VolumeGetOrCreateRequest(
434
446
  deployment_name=name,
435
- environment_name=_get_environment_name(environment_name, resolver),
447
+ environment_name=load_context.environment_name,
436
448
  object_creation_type=(api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING if create_if_missing else None),
437
449
  version=version,
438
450
  )
439
- response = await resolver.client.stub.VolumeGetOrCreate(req)
440
- self._hydrate(response.volume_id, resolver.client, response.metadata)
451
+ response = await load_context.client.stub.VolumeGetOrCreate(req)
452
+ self._hydrate(response.volume_id, load_context.client, response.metadata)
441
453
 
442
454
  rep = _Volume._repr(name, environment_name)
443
- return _Volume._from_loader(_load, rep, hydrate_lazily=True, name=name)
455
+ return _Volume._from_loader(
456
+ _load,
457
+ rep,
458
+ hydrate_lazily=True,
459
+ name=name,
460
+ load_context_overrides=LoadContext(client=client, environment_name=environment_name),
461
+ )
444
462
 
445
463
  @classmethod
446
464
  @asynccontextmanager
modal/volume.pyi CHANGED
@@ -489,6 +489,7 @@ class _Volume(modal._object._Object):
489
489
  environment_name: typing.Optional[str] = None,
490
490
  create_if_missing: bool = False,
491
491
  version: typing.Optional[int] = None,
492
+ client: typing.Optional[modal.client._Client] = None,
492
493
  ) -> _Volume:
493
494
  """Reference a Volume by name, creating if necessary.
494
495
 
@@ -806,6 +807,7 @@ class Volume(modal.object.Object):
806
807
  environment_name: typing.Optional[str] = None,
807
808
  create_if_missing: bool = False,
808
809
  version: typing.Optional[int] = None,
810
+ client: typing.Optional[modal.client.Client] = None,
809
811
  ) -> Volume:
810
812
  """Reference a Volume by name, creating if necessary.
811
813
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.2.dev22
3
+ Version: 1.2.2.dev31
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -13,7 +13,7 @@ Classifier: Topic :: System :: Distributed Computing
13
13
  Classifier: Operating System :: OS Independent
14
14
  Classifier: License :: OSI Approved :: Apache Software License
15
15
  Classifier: Programming Language :: Python :: 3
16
- Requires-Python: >=3.9
16
+ Requires-Python: <3.14,>=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
19
  Requires-Dist: aiohttp
@@ -4,15 +4,16 @@ modal/_billing.py,sha256=C1jUN9f_1WqozSZAt9EOk1nImXUdiLrgFeeAu3R23cI,3012
4
4
  modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA,2884
5
5
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
6
  modal/_container_entrypoint.py,sha256=zYk5mC8_IMx4kWnyFMRHKOrFRLBWchy6x-py3M8FYEw,28084
7
- modal/_functions.py,sha256=QCEm1_6l0WSGlF4ICyH580wd8VyFinQRybQVxUXESuM,90416
8
- modal/_grpc_client.py,sha256=xnrubCsqK8JlbVMLI3_iHuDLmV2rNZjEAQeCDAZl-eE,5558
7
+ modal/_functions.py,sha256=1qzvFuLSgcW4PkowKiC4uDhfhb113jNMI1R3zDThlJo,91482
8
+ modal/_grpc_client.py,sha256=KZcggVNvFL5jRQkFumshMppeFHMbaZI9Dzf13run6As,6083
9
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
10
+ modal/_load_context.py,sha256=OL-rzWl-q2YNGe5nryInNsN1FaaUGOA3sOGlMqw0h9U,3730
10
11
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
11
- modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
12
+ modal/_object.py,sha256=fb_FDjWLDnytVvuBsW4hudDKEer46hiUBNoLs3okOtk,12838
12
13
  modal/_output.py,sha256=eikFqD82RA8uwF-LLVzO-A9EtmoVLnqg0X5nZE5hdLA,26852
13
14
  modal/_partial_function.py,sha256=t0yOVrYrDUdCJt7eVNyBS-atnUtjO56izKB3rDuN17Q,38573
14
15
  modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
15
- modal/_resolver.py,sha256=2RWvm34cNSnbv1v7izJMNZgfvpLDD6LzaBlr0lIrLnY,7364
16
+ modal/_resolver.py,sha256=j_nhDXxT2gbmNEx5b0B8An4ZEt4EKdVLncIj8zF9-nU,7241
16
17
  modal/_resources.py,sha256=NMAp0GCLutiZI4GuKSIVnRHVlstoD3hNGUabjTUtzf4,1794
17
18
  modal/_serialization.py,sha256=_3-Z9jSoleDnv2HghH2kfo0m_WG8Iajs1wop1Iqnam8,26341
18
19
  modal/_traceback.py,sha256=muKP7RbAXq74UGwkaVIdOxDdfDug0UcDKr9fe4LL3m8,6503
@@ -20,69 +21,69 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
20
21
  modal/_tunnel.pyi,sha256=rvC7USR2BcKkbZIeCJXwf7-UfGE-LPLjKsGNiK7Lxa4,13366
21
22
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
22
23
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
23
- modal/app.py,sha256=mS2k4d6yC3zDxm2L3U1gK5O70-epWfVRdo72q_9m6eA,54667
24
- modal/app.pyi,sha256=AUV5Rp8qQrZJTP2waoKHFY7rYgsXNMYibMcCAQKuSeo,50544
24
+ modal/app.py,sha256=wdcdEoWsP7UIH2TnZj39ZiHrQhwX-CH_tqa6yuKL6Xg,55057
25
+ modal/app.pyi,sha256=5XnLb07hnNS5mI7MpLTHSFrDVJbh7lYqHOdU0jz7lnk,50683
25
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
26
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
27
28
  modal/client.py,sha256=tPzihC7R9WtP56k6dyPKi5GLGdLEHdMA6YUj9Ry5G8o,14409
28
- modal/client.pyi,sha256=Iufmh62dIxSFpXXsFwohzTGz82Vhio0yMJhtiuqM0ng,13094
29
- modal/cloud_bucket_mount.py,sha256=I2GRXYhOWLIz2kJZjXu75jAm9EJkBNcutGc6jR2ReUw,5928
30
- modal/cloud_bucket_mount.pyi,sha256=VuUOipMIHqFXMkD-3g2bsoqpSxV5qswlFHDOqPQzYAo,7405
31
- modal/cls.py,sha256=1kxGkqXgAJS6anuWKdbqWx_n0rbXqyFuYJIROeBxNyw,40306
32
- modal/cls.pyi,sha256=jJsDPFoqzM4ht-V-e-xEJKJ5TINLF0fYtoBm_UeAW5Y,27281
29
+ modal/client.pyi,sha256=hY8EdKK9jmeJFFIL5qAdCVscW9iX2npr-dd8n3csMJg,13094
30
+ modal/cloud_bucket_mount.py,sha256=Ff8UFG_Z0HUzcRAAfo1jvDwzaNgiX_btTFOHL7CGyI8,6016
31
+ modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
+ modal/cls.py,sha256=TSkc7XOdfYcMkVfXBHZzhqgnQTUYA8RPdv-DySIT9L0,41883
33
+ modal/cls.pyi,sha256=p8Unbfr0yUdAzYYnD7erSRO7dH-87HkAg4oAn6srBzA,27424
33
34
  modal/config.py,sha256=xUbw_ETdR7S3guj4dyzqdd9EYwRRht3aGYQRogZbi1o,13050
34
35
  modal/container_process.py,sha256=KG2ZkFOWe2KN1b8dFSBLBoW5pWoRxBzJ20MLhDTicJs,16749
35
36
  modal/container_process.pyi,sha256=xMKr-VbQsydS8AbhAys9UTpHHnH2QRyINpPtPG7NwmI,8373
36
- modal/dict.py,sha256=qHu6ZGLwgYWfQig1awWaOeza9EV5g9EexNscq2tGaEs,21317
37
- modal/dict.pyi,sha256=deOiwuwZtwXqedC3h19SwoQIWc4mUnDTBM5XkONt48Y,31712
38
- modal/environments.py,sha256=v_TGina35BlkjG54e3FrEx6zEIKE7w21QoFTNm6u0Ys,5950
39
- modal/environments.pyi,sha256=YwI2zClQ5vZHqqKaBJYX2eK4QHRlUuqRlF0lM1JrMOs,3673
37
+ modal/dict.py,sha256=Omfmj3fUyg7ijTI33Z97geyK7MW8T31LRm-N7pZqSwU,21582
38
+ modal/dict.pyi,sha256=wemd-RTH3__HUsF2zfcVojb2ixE0-Xm0RVKOh5ZSDYE,31835
39
+ modal/environments.py,sha256=wMiMNpPkvIl_BdxRb81CY9Djzhczp_y4GEYKWp0JyBc,6135
40
+ modal/environments.pyi,sha256=bMIxvwahckgaolGD3-hP2iovRHDXewvgbVs_nx4ze0o,3808
40
41
  modal/exception.py,sha256=HrvKRJO4EMwkoqa77PBeZyrGIgEZ-yqLIA10cqZndqI,5768
41
42
  modal/file_io.py,sha256=Whs3QSl3pQbSoLzSRIIWfK4XyP-kwgyZmWgx3bhJ9u0,20933
42
43
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
43
44
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
44
45
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
45
- modal/functions.pyi,sha256=Z6VuukLrjASAgf0kV9I6c09WvP_b2gCujX6f9j2bBaw,37988
46
+ modal/functions.pyi,sha256=9t4rVUEKJcK-_9mnr7IBtCLOyAesa6p_EJjsdSf_hU0,38146
46
47
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
47
- modal/image.py,sha256=SW2QJNZCXpPwLwK5UAjRJexWr1-pUJR6AJJ5OCF7rQI,108048
48
- modal/image.pyi,sha256=NQ82YbSF_kadH0r4UqBDgHPDHZo5_yD8qNEFJgUzJZM,77956
48
+ modal/image.py,sha256=wdgZlQqewK8Tj95uGOq7s8YZ8wFxMhKZtzJFTN-RT0Y,108328
49
+ modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
49
50
  modal/io_streams.py,sha256=Lc-id7HvW-ffJKSoN1xQxf37pHARNkr4re2HKyGpKy4,29316
50
51
  modal/io_streams.pyi,sha256=P9kvQhXmh9fxQNGI2DtuFnnZ_9MJQ4ZiqOpDP2-QWUU,16746
51
- modal/mount.py,sha256=UPel5L2JfeOgI96718SSrjJ0dhMOQgnFDJrzpzsZ4A8,33111
52
- modal/mount.pyi,sha256=MD_zV2M7eCWxbOpQRjU60aHevN-bmbiywaCX82QoFlw,15380
53
- modal/network_file_system.py,sha256=mN26L8Q3jVZjmxSWNKbQHGAIDoZuP1LopVMt5ODqZ1o,13335
54
- modal/network_file_system.pyi,sha256=zF4PIaiuIaC4OLQ0YCj1e2O3uepW9-2Jo1T3blc7RVg,15365
52
+ modal/mount.py,sha256=ifRV6PIU4VZJH4S00E4ILPQ2T7obzTHS_yBdyODSmO8,33298
53
+ modal/mount.pyi,sha256=3_Xftyk2lEMQbt8UzmUW5N77eb7t9EdbczPwj9wue9o,15828
54
+ modal/network_file_system.py,sha256=23GUYz2DZ5kCzlUrdWBq1siBse6fP_CeGt2Lo9xHkR8,13598
55
+ modal/network_file_system.pyi,sha256=A0YyIpxToPTRi-x5DQWtlWPgzw9qHGauvwW7jTcw6y0,15554
55
56
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
56
- modal/object.pyi,sha256=qlyVVMezW3XgJe_iqhtzWRSki3Nuk-KrpXc1g-r8ujA,6944
57
+ modal/object.pyi,sha256=fl-jJ0xYzYyIYBcU7OKubpLOeJHdtREKGYTzByq4x1I,7913
57
58
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
58
59
  modal/parallel_map.py,sha256=VAfhkgCKFXtpba01Dvq7kc-xg5nlP-AdvmJW0LoyfD8,68670
59
60
  modal/parallel_map.pyi,sha256=3sbWnV2ijA2KCh4BV8oNUJMd7ryemJu7NvwsqyUlvho,15588
60
61
  modal/partial_function.py,sha256=aIdlGfTjjgqY6Fpr-biCjvRU9W542_S5N2xkNN_rYGM,1127
61
62
  modal/partial_function.pyi,sha256=M7aHV6sbCc7R28D4Tk6Agr39m6R0emrXvm8IfWflt1o,14023
62
- modal/proxy.py,sha256=CQydu_NPDgApN2GLdd7rrcg8PM-pXyFdVYcTaGMBRCQ,1491
63
- modal/proxy.pyi,sha256=yWGWwADCRGrC2w81B7671UTH4Uv3HMZKy5vVqlJUZoA,1417
63
+ modal/proxy.py,sha256=zIe_ZMAeRu9dgU9FKwZqpvCFTNwLLwIC0Vra4ZZfz1I,1737
64
+ modal/proxy.pyi,sha256=05HihJqRRJydYQSjLMYs9-mxdvzq4OUpKg3PAfrBppo,1597
64
65
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- modal/queue.py,sha256=3IyfLRp_G_sg4-Wr7cplnt3KSjJkL-H3U0asfTacd7I,25536
66
- modal/queue.pyi,sha256=mFu7GFFVFNLU9VZshnfekEsb-ABgpjdhJ07KXHvdv3A,37256
66
+ modal/queue.py,sha256=ABXb1eaGBfl5lKh-O60B0wNi0rT7lZ8gCntMOA4piLQ,25801
67
+ modal/queue.pyi,sha256=XD-VwX9m-lH8Rc4KZXmvuaNZ8f5Sip1clQSTJPdUBZo,37445
67
68
  modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
68
- modal/runner.py,sha256=GP-8dU5J8ZSAVk1U8UtZ0KCxfq3i8Y49hX6BzVJwyaU,25053
69
- modal/runner.pyi,sha256=DV3Z7h0owgRyOu9W5KU5O3UbRftX99KGrZQId91fpsU,8671
69
+ modal/runner.py,sha256=EkEAzZNJyYQa2TNHwCEP0-y_almtOfrfiUoYWv27JGg,25813
70
+ modal/runner.pyi,sha256=HYBi04nUrZN9-L-cTlvDDHFiJS-N6M3usKk1_QzGnpc,8736
70
71
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
71
- modal/sandbox.py,sha256=TwmME5-BHRLcT3PQwc2yzSm3MBKvG0ifBWMOtyzl0TQ,49876
72
+ modal/sandbox.py,sha256=onH4cjq8SAbMhzn7eVOOkYzr-6odBatrCQBX6_R7qjk,50374
72
73
  modal/sandbox.pyi,sha256=XWH57XZIouFGeE-CidVYXdI_l5w-kjCzIhqN4kd2y8Q,57428
73
74
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
74
75
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
75
- modal/secret.py,sha256=ZSI7OAT8YXWQn4gmidH1bwjh8h7z68jxv0of46xiam8,18173
76
- modal/secret.pyi,sha256=2dj8FPBlAJodp_yvwwzV0_Q1VevMNpKxri0rDvlIn4U,20493
77
- modal/serving.py,sha256=3I3WBeVbzZY258u9PXBCW_dZBgypq3OhwBuTVvlgubE,4423
78
- modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
79
- modal/snapshot.py,sha256=DRKSQYwwUonh5Yt3lYUi1P3caJKc-gz4ST2ER7aZlrU,1347
76
+ modal/secret.py,sha256=-W_XuzvmGElDmLv6RawHPski-ZOufCLDhhzR1IF2ayo,18865
77
+ modal/secret.pyi,sha256=LvlFGun262nWO1WbhllpZE4JBkV8-tyXgIjgYX3eXBA,20682
78
+ modal/serving.py,sha256=rfzj23Q4hPSMpc3vj_cQg3awkZULu4hLtRs83cOEB-w,4291
79
+ modal/serving.pyi,sha256=eNqF_bhO_JQ0EDpqvSjSUdNs48vv7AcPXinp7GEs5wI,1966
80
+ modal/snapshot.py,sha256=HiXLbJAZiQv2cEQ4ur8M3AVbI_ZSL-eoteVfCL77lUw,1640
80
81
  modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
81
82
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
82
83
  modal/token_flow.py,sha256=tLvBE9OT50p8AnYYh4b5MvBMQc1vV1-6C0GsmyFDfxw,7626
83
84
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
84
- modal/volume.py,sha256=Fpx6J3OxkIsaVvzzQdt0EdoJjXjP4ahgV8_Piw22r20,51984
85
- modal/volume.pyi,sha256=WZGdwB51qvH5E7d6qS7sNCsscyuHsKUHFyyiZaQyvw8,53212
85
+ modal/volume.py,sha256=gVGp1gvME3n1fALSXgLSRdSMbMiihJKEX5GV599orh8,52432
86
+ modal/volume.pyi,sha256=sBnG6t4aPjH09vlo63S-k4915uz5VNycE-JPgUjwDs8,53335
86
87
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
87
88
  modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
88
89
  modal/_runtime/container_io_manager.py,sha256=MGURW9xa89j6GXzLlZDe9onMvfb-E69HrTyJUPaVXjw,52051
@@ -100,7 +101,7 @@ modal/_utils/blob_utils.py,sha256=NoAWDqYQsqAjievWmH5mCFSXA6XxQStDt9otT-Nh7_g,22
100
101
  modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
101
102
  modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
102
103
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
103
- modal/_utils/function_utils.py,sha256=B5dAhcOM6SK3H-iwbrJjZ7XbjpweFd3YfmuFS26R8fQ,28671
104
+ modal/_utils/function_utils.py,sha256=wL2AA8aEftxCBATPStHgKDRPxrFjPAv-rHt0Wb7y9Ts,28629
104
105
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
105
106
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
106
107
  modal/_utils/grpc_utils.py,sha256=9KOQ3JW6DEmsi0lqve0YkTMU23u9AmWIyvLWJVA3TKc,11515
@@ -135,14 +136,14 @@ modal/cli/app.py,sha256=rbuAG92my-1eZN0olk6p2eD4oBnyBliUsrCOUW-U-9k,7832
135
136
  modal/cli/cluster.py,sha256=BLcKDpwpDmlqE2UC4V0qNpJKiQ-ZXfI9g_SE7u6vnIU,3347
136
137
  modal/cli/config.py,sha256=7xgglsSf5pKfE7ZLz-uZf9S11NBuNbUkUbcZ5nFk8Y0,1721
137
138
  modal/cli/container.py,sha256=meFH-T_Bdyd7a9HjClzGCgYuPq0KhWs_HUUsSW12HjM,3686
138
- modal/cli/dict.py,sha256=YAJtiv41YcCd5Fqam3hXCNTs4Y0yOgGR_i6RfQNSAFM,4572
139
+ modal/cli/dict.py,sha256=8aVWjxdmsPznYNMNYYkKHtrJSEREGc_H21g1hTHa0FM,4686
139
140
  modal/cli/entry_point.py,sha256=7nGM8zob80L5iyLCf_TEmjyinKojquW3_O_V0wDnK-U,4809
140
141
  modal/cli/environment.py,sha256=LGBq8RVQjfBH3EWz8QgmYe19UO66JKSDNxOXMUjw7JM,4285
141
142
  modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
142
143
  modal/cli/launch.py,sha256=oJKGWjTJiXQTdw-SUiCmCQ76bY_8nlzJMUMu0zew0zs,6435
143
144
  modal/cli/network_file_system.py,sha256=MO4YHBdwokXaVv95W4ucmxvi-Q2IpiMrxWLOBhEED5c,8029
144
145
  modal/cli/profile.py,sha256=g8X6tFFK9ccKyu2he9Yu19WLSLNdztzECgmIV__XJFs,3257
145
- modal/cli/queues.py,sha256=-vqEHbbc5XHT0Qbzc4ttQtAGtKzoaeJ8o9B9-WlyMhU,6057
146
+ modal/cli/queues.py,sha256=S5dqk6lEd_2fJolHqoN9iRs6EkeTa0k7KqJWBBGS23k,6170
146
147
  modal/cli/run.py,sha256=3_UF2Vdye_KEgY8JzBBomt0i944cCJx96RfNbeAEPDo,25783
147
148
  modal/cli/secret.py,sha256=zkCztov8c4x8CI8G0EoyieUfv9XLQQtVXV8xeMLK-Os,8044
148
149
  modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
@@ -154,10 +155,10 @@ modal/cli/programs/run_jupyter.py,sha256=IJw8nds8Cjl9j4dxBqMGxhz-bIyVX0kle7jbt8H
154
155
  modal/cli/programs/run_marimo.py,sha256=QlCGPkwQ0XLajt2LtujR_BGsRV1AZ3OCUgZxkkM1lug,2893
155
156
  modal/cli/programs/vscode.py,sha256=E1aJPU7b8RWWj-JX71DifsCoLYsCAnre7lATiBJjUms,3386
156
157
  modal/experimental/__init__.py,sha256=sCwNbBLcR2t-jhrpwtMAPGKt2WNqXBg0xkNZdyB-6CE,13940
157
- modal/experimental/flash.py,sha256=9Xk3W2tMobiP6QknnPUDeOnWf7aE89a1VZ2EByQYmEM,26662
158
+ modal/experimental/flash.py,sha256=RKS3X3h4tY_mOLcMzbRs5tNCLPFL01dBAhCZSqCeBgA,26675
158
159
  modal/experimental/flash.pyi,sha256=uwinKAYxpunNNfBj58FP88DXb535Qik4F6tnJKPAIwQ,14696
159
160
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
160
- modal-1.2.2.dev22.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
+ modal-1.2.2.dev31.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
162
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
162
163
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
163
164
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -165,10 +166,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
165
166
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
166
167
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
167
168
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
168
- modal_proto/api.proto,sha256=EkJaFgWBGchVeHz8q_kICaWfPNhyHyvp7EvsorTpjAo,108773
169
+ modal_proto/api.proto,sha256=_S8S_Ci838KDw8dqf4fmhVOE5_apAuctufrX56ze7bk,109030
169
170
  modal_proto/api_grpc.py,sha256=vwC-GjejDKWbG5jRN3rkU8WBSqQ8Pdj-T2E2xAECAUw,134411
170
- modal_proto/api_pb2.py,sha256=7VoMfkKpoImk7cwhVflvTLoj9Sc5MmMPcciIKpW0Md4,380509
171
- modal_proto/api_pb2.pyi,sha256=1aBhUNXnllNF7tNj_BBbJkqBfaxS22N8uVmQJiBc5_Y,532288
171
+ modal_proto/api_pb2.py,sha256=9D9DrafONt1rKOa8o-Qa-4Et7AGk8_XwV9kYXuja4g8,381073
172
+ modal_proto/api_pb2.pyi,sha256=vAuI2gGBbKY2APIcWitUCSjdw7uM92zU9FL32i6R75s,534109
172
173
  modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,289714
173
174
  modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
174
175
  modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
@@ -185,10 +186,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
185
186
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
186
187
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
187
188
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
188
- modal_version/__init__.py,sha256=MsJO3oAasrQS7UYrJkvfwGmCpvpd4wcEEVEQFOwp-p0,121
189
+ modal_version/__init__.py,sha256=BsqagvnCuIGsPhQjsCROvTtbZNa8sPTNoVYGTscS9uw,121
189
190
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
190
- modal-1.2.2.dev22.dist-info/METADATA,sha256=1hBFVcVHhMuxgzcPfx0YNPzeWNTjNIkNtAbN48NjJR8,2484
191
- modal-1.2.2.dev22.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
192
- modal-1.2.2.dev22.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
193
- modal-1.2.2.dev22.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
194
- modal-1.2.2.dev22.dist-info/RECORD,,
191
+ modal-1.2.2.dev31.dist-info/METADATA,sha256=eHc4WZUCof9mgGVCIIcv874vclj0oqXSpp7Of1bdF7M,2490
192
+ modal-1.2.2.dev31.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
193
+ modal-1.2.2.dev31.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
194
+ modal-1.2.2.dev31.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
195
+ modal-1.2.2.dev31.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -849,6 +849,12 @@ message CloudBucketMount {
849
849
  GCP = 3;
850
850
  }
851
851
 
852
+ enum MetadataTTLType {
853
+ METADATA_TTL_TYPE_UNSPECIFIED = 0;
854
+ METADATA_TTL_TYPE_MINIMAL = 1;
855
+ METADATA_TTL_TYPE_INDEFINITE = 2;
856
+ }
857
+
852
858
  string bucket_name = 1;
853
859
  string mount_path = 2;
854
860
  string credentials_secret_id = 3;
@@ -859,6 +865,10 @@ message CloudBucketMount {
859
865
  optional string key_prefix = 8;
860
866
  optional string oidc_auth_role_arn = 9;
861
867
  bool force_path_style = 10;
868
+ oneof metadata_ttl_oneof {
869
+ MetadataTTLType metadata_ttl_type = 11;
870
+ uint64 metadata_ttl_seconds = 12;
871
+ }
862
872
  }
863
873
 
864
874
  message ClusterGetRequest {