modal 1.2.1.dev19__py3-none-any.whl → 1.2.2.dev21__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 (57) hide show
  1. modal/_clustered_functions.py +1 -3
  2. modal/_container_entrypoint.py +4 -1
  3. modal/_functions.py +33 -49
  4. modal/_grpc_client.py +148 -0
  5. modal/_output.py +3 -4
  6. modal/_runtime/container_io_manager.py +21 -22
  7. modal/_utils/async_utils.py +12 -3
  8. modal/_utils/auth_token_manager.py +1 -4
  9. modal/_utils/blob_utils.py +3 -4
  10. modal/_utils/grpc_utils.py +80 -51
  11. modal/_utils/mount_utils.py +26 -1
  12. modal/_utils/task_command_router_client.py +3 -4
  13. modal/app.py +3 -4
  14. modal/cli/config.py +3 -1
  15. modal/cli/container.py +1 -2
  16. modal/cli/entry_point.py +1 -0
  17. modal/cli/launch.py +1 -2
  18. modal/cli/network_file_system.py +1 -4
  19. modal/cli/queues.py +1 -2
  20. modal/cli/secret.py +1 -2
  21. modal/client.py +5 -115
  22. modal/client.pyi +2 -91
  23. modal/cls.py +1 -2
  24. modal/config.py +1 -1
  25. modal/container_process.py +4 -8
  26. modal/dict.py +12 -12
  27. modal/environments.py +1 -2
  28. modal/experimental/__init__.py +2 -3
  29. modal/experimental/flash.py +6 -10
  30. modal/file_io.py +13 -27
  31. modal/functions.pyi +6 -6
  32. modal/image.py +24 -3
  33. modal/image.pyi +4 -0
  34. modal/io_streams.py +61 -91
  35. modal/io_streams.pyi +33 -95
  36. modal/mount.py +4 -4
  37. modal/network_file_system.py +5 -6
  38. modal/parallel_map.py +29 -31
  39. modal/parallel_map.pyi +3 -9
  40. modal/queue.py +17 -18
  41. modal/runner.py +8 -8
  42. modal/sandbox.py +23 -36
  43. modal/secret.py +4 -5
  44. modal/snapshot.py +1 -4
  45. modal/token_flow.py +1 -1
  46. modal/volume.py +20 -22
  47. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/METADATA +1 -1
  48. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/RECORD +57 -56
  49. modal_proto/api.proto +3 -0
  50. modal_proto/api_pb2.py +1028 -1015
  51. modal_proto/api_pb2.pyi +29 -3
  52. modal_proto/modal_api_grpc.py +175 -175
  53. modal_version/__init__.py +1 -1
  54. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/WHEEL +0 -0
  55. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/entry_points.txt +0 -0
  56. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/licenses/LICENSE +0 -0
  57. {modal-1.2.1.dev19.dist-info → modal-1.2.2.dev21.dist-info}/top_level.txt +0 -0
modal/secret.py CHANGED
@@ -15,7 +15,6 @@ from ._resolver import Resolver
15
15
  from ._runtime.execution_context import is_local
16
16
  from ._utils.async_utils import synchronize_api
17
17
  from ._utils.deprecation import deprecation_warning, warn_if_passing_namespace
18
- from ._utils.grpc_utils import retry_transient_errors
19
18
  from ._utils.name_utils import check_object_name
20
19
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
21
20
  from .client import _Client
@@ -91,7 +90,7 @@ class _SecretManager:
91
90
  env_dict=env_dict,
92
91
  )
93
92
  try:
94
- await retry_transient_errors(client.stub.SecretGetOrCreate, req)
93
+ await client.stub.SecretGetOrCreate(req)
95
94
  except GRPCError as exc:
96
95
  if exc.status == Status.ALREADY_EXISTS and not allow_existing:
97
96
  raise AlreadyExistsError(exc.message)
@@ -143,7 +142,7 @@ class _SecretManager:
143
142
  req = api_pb2.SecretListRequest(
144
143
  environment_name=_get_environment_name(environment_name), pagination=pagination
145
144
  )
146
- resp = await retry_transient_errors(client.stub.SecretList, req)
145
+ resp = await client.stub.SecretList(req)
147
146
  items.extend(resp.items)
148
147
  finished = (len(resp.items) < max_page_size) or (max_objects is not None and len(items) >= max_objects)
149
148
  return finished
@@ -200,7 +199,7 @@ class _SecretManager:
200
199
  raise
201
200
  else:
202
201
  req = api_pb2.SecretDeleteRequest(secret_id=obj.object_id)
203
- await retry_transient_errors(obj._client.stub.SecretDelete, req)
202
+ await obj._client.stub.SecretDelete(req)
204
203
 
205
204
 
206
205
  SecretManager = synchronize_api(_SecretManager)
@@ -454,7 +453,7 @@ class _Secret(_Object, type_prefix="st"):
454
453
  object_creation_type=object_creation_type,
455
454
  env_dict=env_dict,
456
455
  )
457
- resp = await retry_transient_errors(client.stub.SecretGetOrCreate, request)
456
+ resp = await client.stub.SecretGetOrCreate(request)
458
457
  return resp.secret_id
459
458
 
460
459
  @live_method
modal/snapshot.py CHANGED
@@ -6,7 +6,6 @@ from modal_proto import api_pb2
6
6
  from ._object import _Object
7
7
  from ._resolver import Resolver
8
8
  from ._utils.async_utils import synchronize_api
9
- from ._utils.grpc_utils import retry_transient_errors
10
9
  from .client import _Client
11
10
 
12
11
 
@@ -28,9 +27,7 @@ class _SandboxSnapshot(_Object, type_prefix="sn"):
28
27
  client = await _Client.from_env()
29
28
 
30
29
  async def _load(self: _SandboxSnapshot, resolver: Resolver, existing_object_id: Optional[str]):
31
- await retry_transient_errors(
32
- client.stub.SandboxSnapshotGet, api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id)
33
- )
30
+ await client.stub.SandboxSnapshotGet(api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id))
34
31
 
35
32
  rep = "SandboxSnapshot()"
36
33
  obj = _SandboxSnapshot._from_loader(_load, rep)
modal/token_flow.py CHANGED
@@ -56,7 +56,7 @@ class _TokenFlow:
56
56
  req = api_pb2.TokenFlowWaitRequest(
57
57
  token_flow_id=self.token_flow_id, timeout=timeout, wait_secret=self.wait_secret
58
58
  )
59
- resp = await self.stub.TokenFlowWait(req, timeout=(timeout + grpc_extra_timeout))
59
+ resp = await self.stub.TokenFlowWait(req, retry=None, timeout=timeout + grpc_extra_timeout)
60
60
  if not resp.timeout:
61
61
  return resp
62
62
  else:
modal/volume.py CHANGED
@@ -59,7 +59,7 @@ from ._utils.blob_utils import (
59
59
  get_file_upload_spec_from_path,
60
60
  )
61
61
  from ._utils.deprecation import deprecation_warning, warn_if_passing_namespace
62
- from ._utils.grpc_utils import retry_transient_errors
62
+ from ._utils.grpc_utils import Retry
63
63
  from ._utils.http_utils import ClientSessionRegistry
64
64
  from ._utils.name_utils import check_object_name
65
65
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
@@ -170,7 +170,7 @@ class _VolumeManager:
170
170
  version=version,
171
171
  )
172
172
  try:
173
- await retry_transient_errors(client.stub.VolumeGetOrCreate, req)
173
+ await client.stub.VolumeGetOrCreate(req)
174
174
  except GRPCError as exc:
175
175
  if exc.status == Status.ALREADY_EXISTS and not allow_existing:
176
176
  raise AlreadyExistsError(exc.message)
@@ -222,7 +222,7 @@ class _VolumeManager:
222
222
  req = api_pb2.VolumeListRequest(
223
223
  environment_name=_get_environment_name(environment_name), pagination=pagination
224
224
  )
225
- resp = await retry_transient_errors(client.stub.VolumeList, req)
225
+ resp = await client.stub.VolumeList(req)
226
226
  items.extend(resp.items)
227
227
  finished = (len(resp.items) < max_page_size) or (max_objects is not None and len(items) >= max_objects)
228
228
  return finished
@@ -280,7 +280,7 @@ class _VolumeManager:
280
280
  raise
281
281
  else:
282
282
  req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
283
- await retry_transient_errors(obj._client.stub.VolumeDelete, req)
283
+ await obj._client.stub.VolumeDelete(req)
284
284
 
285
285
 
286
286
  VolumeManager = synchronize_api(_VolumeManager)
@@ -519,7 +519,7 @@ class _Volume(_Object, type_prefix="vo"):
519
519
  object_creation_type=api_pb2.OBJECT_CREATION_TYPE_CREATE_FAIL_IF_EXISTS,
520
520
  version=version,
521
521
  )
522
- resp = await retry_transient_errors(client.stub.VolumeGetOrCreate, request)
522
+ resp = await client.stub.VolumeGetOrCreate(request)
523
523
  return resp.volume_id
524
524
 
525
525
  @live_method
@@ -539,7 +539,7 @@ class _Volume(_Object, type_prefix="vo"):
539
539
  async def _do_reload(self, lock=True):
540
540
  async with (await self._get_lock()) if lock else asyncnullcontext():
541
541
  req = api_pb2.VolumeReloadRequest(volume_id=self.object_id)
542
- _ = await retry_transient_errors(self._client.stub.VolumeReload, req)
542
+ _ = await self._client.stub.VolumeReload(req)
543
543
 
544
544
  @live_method
545
545
  async def commit(self):
@@ -552,7 +552,7 @@ class _Volume(_Object, type_prefix="vo"):
552
552
  req = api_pb2.VolumeCommitRequest(volume_id=self.object_id)
553
553
  try:
554
554
  # TODO(gongy): only apply indefinite retries on 504 status.
555
- resp = await retry_transient_errors(self._client.stub.VolumeCommit, req, max_retries=90)
555
+ resp = await self._client.stub.VolumeCommit(req, retry=Retry(max_retries=90))
556
556
  if not resp.skip_reload:
557
557
  # Reload changes on successful commit.
558
558
  await self._do_reload(lock=False)
@@ -648,7 +648,7 @@ class _Volume(_Object, type_prefix="vo"):
648
648
  req = api_pb2.VolumeGetFile2Request(volume_id=self.object_id, path=path)
649
649
 
650
650
  try:
651
- response = await retry_transient_errors(self._client.stub.VolumeGetFile2, req)
651
+ response = await self._client.stub.VolumeGetFile2(req)
652
652
  except modal.exception.NotFoundError as exc:
653
653
  raise FileNotFoundError(exc.args[0])
654
654
 
@@ -701,7 +701,7 @@ class _Volume(_Object, type_prefix="vo"):
701
701
  req = api_pb2.VolumeGetFile2Request(volume_id=self.object_id, path=path)
702
702
 
703
703
  try:
704
- response = await retry_transient_errors(self._client.stub.VolumeGetFile2, req)
704
+ response = await self._client.stub.VolumeGetFile2(req)
705
705
  except modal.exception.NotFoundError as exc:
706
706
  raise FileNotFoundError(exc.args[0])
707
707
 
@@ -751,10 +751,10 @@ class _Volume(_Object, type_prefix="vo"):
751
751
  try:
752
752
  if self._is_v1:
753
753
  req = api_pb2.VolumeRemoveFileRequest(volume_id=self.object_id, path=path, recursive=recursive)
754
- await retry_transient_errors(self._client.stub.VolumeRemoveFile, req)
754
+ await self._client.stub.VolumeRemoveFile(req)
755
755
  else:
756
756
  req = api_pb2.VolumeRemoveFile2Request(volume_id=self.object_id, path=path, recursive=recursive)
757
- await retry_transient_errors(self._client.stub.VolumeRemoveFile2, req)
757
+ await self._client.stub.VolumeRemoveFile2(req)
758
758
  except modal.exception.NotFoundError as exc:
759
759
  raise FileNotFoundError(exc.args[0])
760
760
 
@@ -793,12 +793,12 @@ class _Volume(_Object, type_prefix="vo"):
793
793
  request = api_pb2.VolumeCopyFilesRequest(
794
794
  volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path, recursive=recursive
795
795
  )
796
- await retry_transient_errors(self._client.stub.VolumeCopyFiles, request, base_delay=1)
796
+ await self._client.stub.VolumeCopyFiles(request, retry=Retry(base_delay=1))
797
797
  else:
798
798
  request = api_pb2.VolumeCopyFiles2Request(
799
799
  volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path, recursive=recursive
800
800
  )
801
- await retry_transient_errors(self._client.stub.VolumeCopyFiles2, request, base_delay=1)
801
+ await self._client.stub.VolumeCopyFiles2(request, retry=Retry(base_delay=1))
802
802
 
803
803
  @live_method
804
804
  async def batch_upload(self, force: bool = False) -> "_AbstractVolumeUploadContextManager":
@@ -828,9 +828,7 @@ class _Volume(_Object, type_prefix="vo"):
828
828
 
829
829
  @live_method
830
830
  async def _instance_delete(self):
831
- await retry_transient_errors(
832
- self._client.stub.VolumeDelete, api_pb2.VolumeDeleteRequest(volume_id=self.object_id)
833
- )
831
+ await self._client.stub.VolumeDelete(api_pb2.VolumeDeleteRequest(volume_id=self.object_id))
834
832
 
835
833
  @staticmethod
836
834
  async def delete(name: str, client: Optional[_Client] = None, environment_name: Optional[str] = None):
@@ -859,7 +857,7 @@ class _Volume(_Object, type_prefix="vo"):
859
857
  ):
860
858
  obj = await _Volume.from_name(old_name, environment_name=environment_name).hydrate(client)
861
859
  req = api_pb2.VolumeRenameRequest(volume_id=obj.object_id, name=new_name)
862
- await retry_transient_errors(obj._client.stub.VolumeRename, req)
860
+ await obj._client.stub.VolumeRename(req)
863
861
 
864
862
 
865
863
  Volume = synchronize_api(_Volume)
@@ -960,7 +958,7 @@ class _VolumeUploadContextManager(_AbstractVolumeUploadContextManager):
960
958
  disallow_overwrite_existing_files=not self._force,
961
959
  )
962
960
  try:
963
- await retry_transient_errors(self._client.stub.VolumePutFiles, request, base_delay=1)
961
+ await self._client.stub.VolumePutFiles(request, retry=Retry(base_delay=1))
964
962
  except GRPCError as exc:
965
963
  raise FileExistsError(exc.message) if exc.status == Status.ALREADY_EXISTS else exc
966
964
 
@@ -1020,7 +1018,7 @@ class _VolumeUploadContextManager(_AbstractVolumeUploadContextManager):
1020
1018
  remote_filename = file_spec.mount_filename
1021
1019
  progress_task_id = self._progress_cb(name=remote_filename, size=file_spec.size)
1022
1020
  request = api_pb2.MountPutFileRequest(sha256_hex=file_spec.sha256_hex)
1023
- response = await retry_transient_errors(self._client.stub.MountPutFile, request, base_delay=1)
1021
+ response = await self._client.stub.MountPutFile(request, retry=Retry(base_delay=1))
1024
1022
 
1025
1023
  start_time = time.monotonic()
1026
1024
  if not response.exists:
@@ -1044,7 +1042,7 @@ class _VolumeUploadContextManager(_AbstractVolumeUploadContextManager):
1044
1042
  self._progress_cb(task_id=progress_task_id, complete=True)
1045
1043
 
1046
1044
  while (time.monotonic() - start_time) < VOLUME_PUT_FILE_CLIENT_TIMEOUT:
1047
- response = await retry_transient_errors(self._client.stub.MountPutFile, request2, base_delay=1)
1045
+ response = await self._client.stub.MountPutFile(request2, retry=Retry(base_delay=1))
1048
1046
  if response.exists:
1049
1047
  break
1050
1048
 
@@ -1204,7 +1202,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
1204
1202
  )
1205
1203
 
1206
1204
  try:
1207
- response = await retry_transient_errors(self._client.stub.VolumePutFiles2, request, base_delay=1)
1205
+ response = await self._client.stub.VolumePutFiles2(request, retry=Retry(base_delay=1))
1208
1206
  except GRPCError as exc:
1209
1207
  raise FileExistsError(exc.message) if exc.status == Status.ALREADY_EXISTS else exc
1210
1208
 
@@ -1265,7 +1263,7 @@ async def _put_missing_blocks(
1265
1263
  file_progress.pending_blocks.add(missing_block.block_index)
1266
1264
  task_progress_cb = functools.partial(progress_cb, task_id=file_progress.task_id)
1267
1265
 
1268
- @retry(n_attempts=5, base_delay=0.5, timeout=None)
1266
+ @retry(n_attempts=11, base_delay=0.5, timeout=None)
1269
1267
  async def put_missing_block_attempt(payload: BytesIOSegmentPayload) -> bytes:
1270
1268
  with payload.reset_on_error(subtract_progress=True):
1271
1269
  async with ClientSessionRegistry.get_session().put(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev19
3
+ Version: 1.2.2.dev21
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,14 +1,15 @@
1
1
  modal/__init__.py,sha256=WMaRW-2IJRGA9ioNAaBhJYuyLvu-GS01L8wQD90fKBs,2682
2
2
  modal/__main__.py,sha256=45H-GtwzaDfN-1nP4_HYvzN3s7AG_HXR4-ynrsjO_OI,2803
3
3
  modal/_billing.py,sha256=C1jUN9f_1WqozSZAt9EOk1nImXUdiLrgFeeAu3R23cI,3012
4
- modal/_clustered_functions.py,sha256=Sy4Sf_17EO8OL-FUe8LYcm4hrqLyQFCssNhr3p0SroU,3013
4
+ modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA,2884
5
5
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
- modal/_container_entrypoint.py,sha256=B_fIKKjWposiNsYOePifX7S6cR9hf5LRPhDfVums5O8,27867
7
- modal/_functions.py,sha256=7YbMBWtMMWLFxCaD3MSD-2iU1R7v5HRxfve-vGNzHnE,90991
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
8
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
9
10
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
10
11
  modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
11
- modal/_output.py,sha256=sdQqEuWVknHwLPzuz_7eUYqF9TvmQkSfEjm1E__bzbY,26892
12
+ modal/_output.py,sha256=eikFqD82RA8uwF-LLVzO-A9EtmoVLnqg0X5nZE5hdLA,26852
12
13
  modal/_partial_function.py,sha256=t0yOVrYrDUdCJt7eVNyBS-atnUtjO56izKB3rDuN17Q,38573
13
14
  modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
14
15
  modal/_resolver.py,sha256=2RWvm34cNSnbv1v7izJMNZgfvpLDD6LzaBlr0lIrLnY,7364
@@ -19,72 +20,72 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
19
20
  modal/_tunnel.pyi,sha256=rvC7USR2BcKkbZIeCJXwf7-UfGE-LPLjKsGNiK7Lxa4,13366
20
21
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
21
22
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
22
- modal/app.py,sha256=FCU0n_qdKSIZNdNRX2EpbiukM1dY5LBdBNwro5xJB4k,54793
23
+ modal/app.py,sha256=mS2k4d6yC3zDxm2L3U1gK5O70-epWfVRdo72q_9m6eA,54667
23
24
  modal/app.pyi,sha256=AUV5Rp8qQrZJTP2waoKHFY7rYgsXNMYibMcCAQKuSeo,50544
24
25
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
25
26
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
26
- modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
27
- modal/client.pyi,sha256=r3_GX0VfLwiVR0Fl5W6XD_geEkga0PMVGj-_V7FKKjM,15831
27
+ modal/client.py,sha256=tPzihC7R9WtP56k6dyPKi5GLGdLEHdMA6YUj9Ry5G8o,14409
28
+ modal/client.pyi,sha256=s_IT8XcG1tfW2xcmkbV6VVPi34dHBWKY9mqizveqhqk,13094
28
29
  modal/cloud_bucket_mount.py,sha256=I2GRXYhOWLIz2kJZjXu75jAm9EJkBNcutGc6jR2ReUw,5928
29
30
  modal/cloud_bucket_mount.pyi,sha256=VuUOipMIHqFXMkD-3g2bsoqpSxV5qswlFHDOqPQzYAo,7405
30
- modal/cls.py,sha256=ZxzivE3fNci4-A5uyBYNAzXMXtdqDg3gnYvgbdy5fhg,40384
31
+ modal/cls.py,sha256=1kxGkqXgAJS6anuWKdbqWx_n0rbXqyFuYJIROeBxNyw,40306
31
32
  modal/cls.pyi,sha256=jJsDPFoqzM4ht-V-e-xEJKJ5TINLF0fYtoBm_UeAW5Y,27281
32
- modal/config.py,sha256=hpgkgQKbjzo6gVbRzXQrky72_KpdSEm65RNi1M2iNjc,13038
33
- modal/container_process.py,sha256=S-JgzAqEBlYWw7f5gwbb_RVKA2APn-VAnInrntIWBL0,16948
33
+ modal/config.py,sha256=xUbw_ETdR7S3guj4dyzqdd9EYwRRht3aGYQRogZbi1o,13050
34
+ modal/container_process.py,sha256=KG2ZkFOWe2KN1b8dFSBLBoW5pWoRxBzJ20MLhDTicJs,16749
34
35
  modal/container_process.pyi,sha256=xMKr-VbQsydS8AbhAys9UTpHHnH2QRyINpPtPG7NwmI,8373
35
- modal/dict.py,sha256=XkaxuojMVtcc4bZvCjJcd6DedU5xxfF8H4w-mDzFPCo,21580
36
+ modal/dict.py,sha256=qHu6ZGLwgYWfQig1awWaOeza9EV5g9EexNscq2tGaEs,21317
36
37
  modal/dict.pyi,sha256=deOiwuwZtwXqedC3h19SwoQIWc4mUnDTBM5XkONt48Y,31712
37
- modal/environments.py,sha256=xXYDfgzd20CuFdww_zQ53OB0qANQG-j_ls_fT7mGdoQ,6028
38
+ modal/environments.py,sha256=v_TGina35BlkjG54e3FrEx6zEIKE7w21QoFTNm6u0Ys,5950
38
39
  modal/environments.pyi,sha256=YwI2zClQ5vZHqqKaBJYX2eK4QHRlUuqRlF0lM1JrMOs,3673
39
40
  modal/exception.py,sha256=HrvKRJO4EMwkoqa77PBeZyrGIgEZ-yqLIA10cqZndqI,5768
40
- modal/file_io.py,sha256=OSKr77TujcXGJW1iikzYiHckLSmv07QBgBHcxxYEkoI,21456
41
+ modal/file_io.py,sha256=Whs3QSl3pQbSoLzSRIIWfK4XyP-kwgyZmWgx3bhJ9u0,20933
41
42
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
42
43
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
43
44
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
44
- modal/functions.pyi,sha256=CMwApS396tdElFrjnV6RuL2DTCz4C3jYzYoq1y_LPUQ,37988
45
+ modal/functions.pyi,sha256=Z6VuukLrjASAgf0kV9I6c09WvP_b2gCujX6f9j2bBaw,37988
45
46
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
46
- modal/image.py,sha256=HDkOnhIAN8g63a8LTN4J5SjC9ciReFQQJIxTS2z5KFM,107216
47
- modal/image.pyi,sha256=dMvMwAuvWkNN2BRYJFijkEy2m_xtEXgCKK0T7FVldsc,77514
48
- modal/io_streams.py,sha256=6fTMyPt8wCdoWFH5EuEBoW1Ye0dHITaxxMmzDPA-sdM,29565
49
- modal/io_streams.pyi,sha256=h7qtAbj8LsN-eJKAGjBhnMBegvWprc_0AmwVFi6rj2Y,18084
50
- modal/mount.py,sha256=G7_xhQMZqokgfsaFLMch0YR3fs-OUNqYUm3f4jHTSMQ,33161
47
+ modal/image.py,sha256=SW2QJNZCXpPwLwK5UAjRJexWr1-pUJR6AJJ5OCF7rQI,108048
48
+ modal/image.pyi,sha256=NQ82YbSF_kadH0r4UqBDgHPDHZo5_yD8qNEFJgUzJZM,77956
49
+ modal/io_streams.py,sha256=Lc-id7HvW-ffJKSoN1xQxf37pHARNkr4re2HKyGpKy4,29316
50
+ modal/io_streams.pyi,sha256=P9kvQhXmh9fxQNGI2DtuFnnZ_9MJQ4ZiqOpDP2-QWUU,16746
51
+ modal/mount.py,sha256=UPel5L2JfeOgI96718SSrjJ0dhMOQgnFDJrzpzsZ4A8,33111
51
52
  modal/mount.pyi,sha256=MD_zV2M7eCWxbOpQRjU60aHevN-bmbiywaCX82QoFlw,15380
52
- modal/network_file_system.py,sha256=ZdEIRgdcR-p_ILyw_AecEtPOhhrSWJeADYCtFnhtaHM,13509
53
+ modal/network_file_system.py,sha256=mN26L8Q3jVZjmxSWNKbQHGAIDoZuP1LopVMt5ODqZ1o,13335
53
54
  modal/network_file_system.pyi,sha256=zF4PIaiuIaC4OLQ0YCj1e2O3uepW9-2Jo1T3blc7RVg,15365
54
55
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
55
56
  modal/object.pyi,sha256=qlyVVMezW3XgJe_iqhtzWRSki3Nuk-KrpXc1g-r8ujA,6944
56
57
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
57
- modal/parallel_map.py,sha256=E5UYVszgLR8ppOUOqCgkqgn5A93yVMvJ5YmgGgrjyQo,68991
58
- modal/parallel_map.pyi,sha256=NZrtfZljig59hcMKU7Cz8lYZZFOiwK9l7oWrBtX6Oy8,15838
58
+ modal/parallel_map.py,sha256=VAfhkgCKFXtpba01Dvq7kc-xg5nlP-AdvmJW0LoyfD8,68670
59
+ modal/parallel_map.pyi,sha256=3sbWnV2ijA2KCh4BV8oNUJMd7ryemJu7NvwsqyUlvho,15588
59
60
  modal/partial_function.py,sha256=aIdlGfTjjgqY6Fpr-biCjvRU9W542_S5N2xkNN_rYGM,1127
60
61
  modal/partial_function.pyi,sha256=M7aHV6sbCc7R28D4Tk6Agr39m6R0emrXvm8IfWflt1o,14023
61
62
  modal/proxy.py,sha256=CQydu_NPDgApN2GLdd7rrcg8PM-pXyFdVYcTaGMBRCQ,1491
62
63
  modal/proxy.pyi,sha256=yWGWwADCRGrC2w81B7671UTH4Uv3HMZKy5vVqlJUZoA,1417
63
64
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- modal/queue.py,sha256=aaH3SNWeh_HjEyVUtFiN345v0GJFoucJ6aNDrDggWZQ,25775
65
+ modal/queue.py,sha256=3IyfLRp_G_sg4-Wr7cplnt3KSjJkL-H3U0asfTacd7I,25536
65
66
  modal/queue.pyi,sha256=mFu7GFFVFNLU9VZshnfekEsb-ABgpjdhJ07KXHvdv3A,37256
66
67
  modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
67
- modal/runner.py,sha256=Ni54hwa42SEBxLPpqFwKMsUPYY8Dv-I-Kz3_jL1StCI,25220
68
+ modal/runner.py,sha256=GP-8dU5J8ZSAVk1U8UtZ0KCxfq3i8Y49hX6BzVJwyaU,25053
68
69
  modal/runner.pyi,sha256=DV3Z7h0owgRyOu9W5KU5O3UbRftX99KGrZQId91fpsU,8671
69
70
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
70
- modal/sandbox.py,sha256=QHpnp7ifmlVSzJcJyRCEHYmhvu5SrLBVjIx6gaTnlXg,51071
71
+ modal/sandbox.py,sha256=NbMS4iLQvz0moFZEcndXJ1OwpwVzXJDnoyMVugNrb3U,50295
71
72
  modal/sandbox.pyi,sha256=VqGO59NZX5fSU1tnA_g0pAd7eq6GvV6lNtC8TH9Xlo8,57478
72
73
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
73
74
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
74
- modal/secret.py,sha256=ThwP-PkwUZwiYkygqumh15n8P_77-N5ZyRWLc6I3r28,18323
75
+ modal/secret.py,sha256=ZSI7OAT8YXWQn4gmidH1bwjh8h7z68jxv0of46xiam8,18173
75
76
  modal/secret.pyi,sha256=2dj8FPBlAJodp_yvwwzV0_Q1VevMNpKxri0rDvlIn4U,20493
76
77
  modal/serving.py,sha256=3I3WBeVbzZY258u9PXBCW_dZBgypq3OhwBuTVvlgubE,4423
77
78
  modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
78
- modal/snapshot.py,sha256=E3oxYQkYVRB_LeFBfmUV1Y6vHz8-azXJfC4x7A1QKnI,1455
79
+ modal/snapshot.py,sha256=DRKSQYwwUonh5Yt3lYUi1P3caJKc-gz4ST2ER7aZlrU,1347
79
80
  modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
80
81
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
81
- modal/token_flow.py,sha256=GWpar0gANs71vm9Bd_Cj87UG1K3ljTURbkEjG3JLsrY,7616
82
+ modal/token_flow.py,sha256=tLvBE9OT50p8AnYYh4b5MvBMQc1vV1-6C0GsmyFDfxw,7626
82
83
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
83
- modal/volume.py,sha256=N-YnuRgYod9VsgfGQ2_c-0yWOLEleGfuNbxj6eihSYI,52363
84
+ modal/volume.py,sha256=Fpx6J3OxkIsaVvzzQdt0EdoJjXjP4ahgV8_Piw22r20,51984
84
85
  modal/volume.pyi,sha256=WZGdwB51qvH5E7d6qS7sNCsscyuHsKUHFyyiZaQyvw8,53212
85
86
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
86
87
  modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
87
- modal/_runtime/container_io_manager.py,sha256=Q3JUEYrsfWsG0DuuVUiYXAUccfb8RhM8ExQEQJXR0nc,52200
88
+ modal/_runtime/container_io_manager.py,sha256=MGURW9xa89j6GXzLlZDe9onMvfb-E69HrTyJUPaVXjw,52051
88
89
  modal/_runtime/container_io_manager.pyi,sha256=GDNLirCcPMRc6gckInYKmGmJZY3LNcgUVXKftt9P9jI,23493
89
90
  modal/_runtime/execution_context.py,sha256=AYrNQRHHXEqX2MwMf8zxelKZnYf25RE_B-NRLWf93n8,3521
90
91
  modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdgWuU4W9k,2426
@@ -93,27 +94,27 @@ modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5
93
94
  modal/_runtime/user_code_imports.py,sha256=1MlOgw810aj0MeDvFPvHBIz-aHd7jUX6dwRfIcM3-KE,16498
94
95
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
95
96
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
96
- modal/_utils/async_utils.py,sha256=7uA4KJV7XRgak5nXZSGRE-RN1h91UOyNwK6v_ilUQMQ,29737
97
- modal/_utils/auth_token_manager.py,sha256=i-kfLgDd4BMAw6wouO5aKfNGHo27VAZoVOsbEWqDr2I,5252
98
- modal/_utils/blob_utils.py,sha256=bmPPHfLy8Kdna8e2xS3lvKwnN5pJUUt_rN39kVIYPFM,22874
97
+ modal/_utils/async_utils.py,sha256=j2DEgAvYrp89tni0_oS-YotT8npvTlY97DExfiUHG4E,30057
98
+ modal/_utils/auth_token_manager.py,sha256=QsDokl1c1dN9m6Z9N-Se-8cY3laphByjJtNdRXUTieI,5151
99
+ modal/_utils/blob_utils.py,sha256=NoAWDqYQsqAjievWmH5mCFSXA6XxQStDt9otT-Nh7_g,22755
99
100
  modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
100
101
  modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
101
102
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
102
103
  modal/_utils/function_utils.py,sha256=B5dAhcOM6SK3H-iwbrJjZ7XbjpweFd3YfmuFS26R8fQ,28671
103
104
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
104
105
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
105
- modal/_utils/grpc_utils.py,sha256=1dQgTvdHG9KSfyVTc26HhKjGnIDJpdDEJ0xZARklOrU,10205
106
+ modal/_utils/grpc_utils.py,sha256=9KOQ3JW6DEmsi0lqve0YkTMU23u9AmWIyvLWJVA3TKc,11515
106
107
  modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,3034
107
108
  modal/_utils/http_utils.py,sha256=yeTFsXYr0rYMEhB7vBP7audG9Uc7OLhzKBANFDZWVt0,2451
108
109
  modal/_utils/jwt_utils.py,sha256=fxH9plyrbAemTbjSsQtzIdDXE9QXxvMC4DiUZ16G0aA,1360
109
110
  modal/_utils/logger.py,sha256=NgbMKFT9chYYt_TU01DdIior5ByYr2gZtrWIk1SFRLc,1782
110
- modal/_utils/mount_utils.py,sha256=gGCgIlWwYiJbUtgFY2GJcWYismYvazbMAeUOgf7NhFQ,3205
111
+ modal/_utils/mount_utils.py,sha256=3v6wbSvEjOhIlnLGbyXKOzdoXaG-FwNAZ_Rr0io_v2o,4113
111
112
  modal/_utils/name_utils.py,sha256=CIQL0Y4z47tq0rfNL2Kdo5dxsGrxoN2hR9Ko0HapeE4,2517
112
113
  modal/_utils/package_utils.py,sha256=LcL2olGN4xaUzu2Tbv-C-Ft9Qp6bsLxEfETOAVd-mjU,2073
113
114
  modal/_utils/pattern_utils.py,sha256=ZUffaECfe2iYBhH6cvCB-0-UWhmEBTZEl_TwG_So3ag,6714
114
115
  modal/_utils/rand_pb_testing.py,sha256=mmVPk1rZldHwHZx0DnHTuHQlRLAiiAYdxjwEJpxvT9c,3900
115
116
  modal/_utils/shell_utils.py,sha256=hWHzv730Br2Xyj6cGPiMZ-198Z3RZuOu3pDXhFSZ22c,2157
116
- modal/_utils/task_command_router_client.py,sha256=ugWyExVncfs_9SbcPaWjMi3gmXPaQWI-8LuL-xHah7M,23589
117
+ modal/_utils/task_command_router_client.py,sha256=ZoajSdIyAv_YXxpyY0jNsr_543FjTbSzyVONmaETqkw,23531
117
118
  modal/_utils/time_utils.py,sha256=43tpFVwT7ykOjlETIFLVt9auMsRZqYYRYBEKxGCrRSA,1212
118
119
  modal/_vendor/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
119
120
  modal/_vendor/a2wsgi_wsgi.py,sha256=Q1AsjpV_Q_vzQsz_cSqmP9jWzsGsB-ARFU6vpQYml8k,21878
@@ -132,18 +133,18 @@ modal/cli/_download.py,sha256=_Q_CG1Qb4cjVSAwHGGPOPoNTsmK9gHvF-HNWCNdFjaY,4900
132
133
  modal/cli/_traceback.py,sha256=IKj9xtc6LjAxyhGJWolNIXEX3MhAIulnRqywZNOFmkU,7324
133
134
  modal/cli/app.py,sha256=rbuAG92my-1eZN0olk6p2eD4oBnyBliUsrCOUW-U-9k,7832
134
135
  modal/cli/cluster.py,sha256=BLcKDpwpDmlqE2UC4V0qNpJKiQ-ZXfI9g_SE7u6vnIU,3347
135
- modal/cli/config.py,sha256=lhp2Pq4RbTDhaZJ-ZJvhrMqJj8c-WjuRX6gjE3TrvXc,1691
136
- modal/cli/container.py,sha256=IdJ07p7hwFGXz3oYB__NYilucWpVv-K1JL3QKduu7ok,3769
136
+ modal/cli/config.py,sha256=7xgglsSf5pKfE7ZLz-uZf9S11NBuNbUkUbcZ5nFk8Y0,1721
137
+ modal/cli/container.py,sha256=meFH-T_Bdyd7a9HjClzGCgYuPq0KhWs_HUUsSW12HjM,3686
137
138
  modal/cli/dict.py,sha256=YAJtiv41YcCd5Fqam3hXCNTs4Y0yOgGR_i6RfQNSAFM,4572
138
- modal/cli/entry_point.py,sha256=F06p54rPOs1xAUeYW76RaimFOgLW_I17RCvNwfZRqPc,4747
139
+ modal/cli/entry_point.py,sha256=7nGM8zob80L5iyLCf_TEmjyinKojquW3_O_V0wDnK-U,4809
139
140
  modal/cli/environment.py,sha256=LGBq8RVQjfBH3EWz8QgmYe19UO66JKSDNxOXMUjw7JM,4285
140
141
  modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
141
- modal/cli/launch.py,sha256=VARim2SCzgtI1ZuxQ6JgTTtvFwGA5czCwQZQHWC8Zcc,6498
142
- modal/cli/network_file_system.py,sha256=I9IqTpVfk32uKYwGd8LTldkQx6UKYrQYNZ26q7Ab5Oo,8126
142
+ modal/cli/launch.py,sha256=oJKGWjTJiXQTdw-SUiCmCQ76bY_8nlzJMUMu0zew0zs,6435
143
+ modal/cli/network_file_system.py,sha256=MO4YHBdwokXaVv95W4ucmxvi-Q2IpiMrxWLOBhEED5c,8029
143
144
  modal/cli/profile.py,sha256=g8X6tFFK9ccKyu2he9Yu19WLSLNdztzECgmIV__XJFs,3257
144
- modal/cli/queues.py,sha256=5vKtKQ7YExdaxNPYZ0g5suU9sX0-F5h0zy0qBV-hN80,6140
145
+ modal/cli/queues.py,sha256=-vqEHbbc5XHT0Qbzc4ttQtAGtKzoaeJ8o9B9-WlyMhU,6057
145
146
  modal/cli/run.py,sha256=3_UF2Vdye_KEgY8JzBBomt0i944cCJx96RfNbeAEPDo,25783
146
- modal/cli/secret.py,sha256=-Nnk3fq1IEzMtC9VUn61AKmdvZzZ9XQyiKVgQYRpajo,8127
147
+ modal/cli/secret.py,sha256=zkCztov8c4x8CI8G0EoyieUfv9XLQQtVXV8xeMLK-Os,8044
147
148
  modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
148
149
  modal/cli/utils.py,sha256=aUXDU9_VgcJrGaGRy4bGf4dqwKYXHCpoO27x4m_bpuo,3293
149
150
  modal/cli/volume.py,sha256=wJchJyIEw9lTKiNUNTgR4I3DPYHYJBu50gU_SsecP0w,10877
@@ -152,11 +153,11 @@ modal/cli/programs/launch_instance_ssh.py,sha256=GrwK_Vy8-7B4x5a6AqFaF7lqNVgu75J
152
153
  modal/cli/programs/run_jupyter.py,sha256=IJw8nds8Cjl9j4dxBqMGxhz-bIyVX0kle7jbt8HFOhM,2688
153
154
  modal/cli/programs/run_marimo.py,sha256=QlCGPkwQ0XLajt2LtujR_BGsRV1AZ3OCUgZxkkM1lug,2893
154
155
  modal/cli/programs/vscode.py,sha256=E1aJPU7b8RWWj-JX71DifsCoLYsCAnre7lATiBJjUms,3386
155
- modal/experimental/__init__.py,sha256=9gkVuDmu3m4TlKoU3MzEtTOemUSs8EEOWba40s7Aa0M,14043
156
- modal/experimental/flash.py,sha256=-lSyFBbeT6UT-uB29L955SNh6L6ISg_uBDy5gF4ZpLo,26919
156
+ modal/experimental/__init__.py,sha256=sCwNbBLcR2t-jhrpwtMAPGKt2WNqXBg0xkNZdyB-6CE,13940
157
+ modal/experimental/flash.py,sha256=9Xk3W2tMobiP6QknnPUDeOnWf7aE89a1VZ2EByQYmEM,26662
157
158
  modal/experimental/flash.pyi,sha256=uwinKAYxpunNNfBj58FP88DXb535Qik4F6tnJKPAIwQ,14696
158
159
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
159
- modal-1.2.1.dev19.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
160
+ modal-1.2.2.dev21.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
160
161
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
161
162
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
162
163
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -164,13 +165,13 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
164
165
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
165
166
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
166
167
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
167
- modal_proto/api.proto,sha256=GYn-HjF_vc7Y4_BvHZBCG-c9ZJU0CWnyX_Lk973J2Pw,108645
168
+ modal_proto/api.proto,sha256=EkJaFgWBGchVeHz8q_kICaWfPNhyHyvp7EvsorTpjAo,108773
168
169
  modal_proto/api_grpc.py,sha256=vwC-GjejDKWbG5jRN3rkU8WBSqQ8Pdj-T2E2xAECAUw,134411
169
- modal_proto/api_pb2.py,sha256=EtmyiWUznFw_YzPhrw9U4SuXuDsAgZigozbPR4n4TG4,379625
170
- modal_proto/api_pb2.pyi,sha256=77N3MpNhleBngbyMkph2w87IZmj9DVxhJ1Ezc1Aosmw,531180
170
+ modal_proto/api_pb2.py,sha256=7VoMfkKpoImk7cwhVflvTLoj9Sc5MmMPcciIKpW0Md4,380509
171
+ modal_proto/api_pb2.pyi,sha256=1aBhUNXnllNF7tNj_BBbJkqBfaxS22N8uVmQJiBc5_Y,532288
171
172
  modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,289714
172
173
  modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
173
- modal_proto/modal_api_grpc.py,sha256=ME4PoI4cm7_Tpi3duU6-0O5LwhbYKrgJ5n3ijWgeNss,20256
174
+ modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
174
175
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
176
  modal_proto/sandbox_router.proto,sha256=o6LZWekz2h7uAhBlHcu_EqXnc5ptxm-4j_ZUFVGAJFk,5161
176
177
  modal_proto/sandbox_router_grpc.py,sha256=27daOTX2N5hADDG-5Qnn4Yj3VfekyJwrDUkrQ12mPuU,5004
@@ -184,10 +185,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
184
185
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
185
186
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
186
187
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
187
- modal_version/__init__.py,sha256=V4yOgaPYUwmYXAbe1KpQdUT92bUrJXtHryPE43QGHiU,121
188
+ modal_version/__init__.py,sha256=0xqMZmBrC75YQupzkYZGu0f5eFCPWbDIn-I0EQwqHGk,121
188
189
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
189
- modal-1.2.1.dev19.dist-info/METADATA,sha256=bUY7vum3GagZank175-UoEUEcZWrHdfIPBz8px1Shvc,2484
190
- modal-1.2.1.dev19.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
191
- modal-1.2.1.dev19.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
192
- modal-1.2.1.dev19.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
193
- modal-1.2.1.dev19.dist-info/RECORD,,
190
+ modal-1.2.2.dev21.dist-info/METADATA,sha256=eivPEsX6sFzI5srzC8tA17IzIzSdEhzTq5aEI8jkoG4,2484
191
+ modal-1.2.2.dev21.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
192
+ modal-1.2.2.dev21.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
193
+ modal-1.2.2.dev21.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
194
+ modal-1.2.2.dev21.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -301,6 +301,7 @@ message AppCreateRequest {
301
301
  string description = 2; // Human readable label for the app
302
302
  string environment_name = 5;
303
303
  AppState app_state = 6;
304
+ map<string, string> tags = 7; // Additional metadata to attach to the App
304
305
  }
305
306
 
306
307
  message AppCreateResponse {
@@ -857,6 +858,7 @@ message CloudBucketMount {
857
858
  optional string bucket_endpoint_url = 7;
858
859
  optional string key_prefix = 8;
859
860
  optional string oidc_auth_role_arn = 9;
861
+ bool force_path_style = 10;
860
862
  }
861
863
 
862
864
  message ClusterGetRequest {
@@ -2461,6 +2463,7 @@ message ProxyAddIpResponse {
2461
2463
  message ProxyCreateRequest {
2462
2464
  string name = 1;
2463
2465
  string environment_name = 2;
2466
+ string region = 3;
2464
2467
  }
2465
2468
 
2466
2469
  message ProxyCreateResponse {