modal 1.1.5.dev83__py3-none-any.whl → 1.3.1.dev8__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.

Files changed (139) hide show
  1. modal/__init__.py +4 -4
  2. modal/__main__.py +4 -29
  3. modal/_billing.py +84 -0
  4. modal/_clustered_functions.py +1 -3
  5. modal/_container_entrypoint.py +33 -208
  6. modal/_functions.py +146 -121
  7. modal/_grpc_client.py +191 -0
  8. modal/_ipython.py +16 -6
  9. modal/_load_context.py +106 -0
  10. modal/_object.py +72 -21
  11. modal/_output.py +12 -14
  12. modal/_partial_function.py +31 -4
  13. modal/_resolver.py +44 -57
  14. modal/_runtime/container_io_manager.py +26 -28
  15. modal/_runtime/container_io_manager.pyi +42 -44
  16. modal/_runtime/gpu_memory_snapshot.py +9 -7
  17. modal/_runtime/user_code_event_loop.py +80 -0
  18. modal/_runtime/user_code_imports.py +236 -10
  19. modal/_serialization.py +2 -1
  20. modal/_traceback.py +4 -13
  21. modal/_tunnel.py +16 -11
  22. modal/_tunnel.pyi +25 -3
  23. modal/_utils/async_utils.py +337 -10
  24. modal/_utils/auth_token_manager.py +1 -4
  25. modal/_utils/blob_utils.py +29 -22
  26. modal/_utils/function_utils.py +20 -21
  27. modal/_utils/grpc_testing.py +6 -3
  28. modal/_utils/grpc_utils.py +223 -64
  29. modal/_utils/mount_utils.py +26 -1
  30. modal/_utils/package_utils.py +0 -1
  31. modal/_utils/rand_pb_testing.py +8 -1
  32. modal/_utils/task_command_router_client.py +524 -0
  33. modal/_vendor/cloudpickle.py +144 -48
  34. modal/app.py +215 -96
  35. modal/app.pyi +78 -37
  36. modal/billing.py +5 -0
  37. modal/builder/2025.06.txt +6 -3
  38. modal/builder/PREVIEW.txt +2 -1
  39. modal/builder/base-images.json +4 -2
  40. modal/cli/_download.py +19 -3
  41. modal/cli/cluster.py +4 -2
  42. modal/cli/config.py +3 -1
  43. modal/cli/container.py +5 -4
  44. modal/cli/dict.py +5 -2
  45. modal/cli/entry_point.py +26 -2
  46. modal/cli/environment.py +2 -16
  47. modal/cli/launch.py +1 -76
  48. modal/cli/network_file_system.py +5 -20
  49. modal/cli/queues.py +5 -4
  50. modal/cli/run.py +24 -204
  51. modal/cli/secret.py +1 -2
  52. modal/cli/shell.py +375 -0
  53. modal/cli/utils.py +1 -13
  54. modal/cli/volume.py +11 -17
  55. modal/client.py +16 -125
  56. modal/client.pyi +94 -144
  57. modal/cloud_bucket_mount.py +3 -1
  58. modal/cloud_bucket_mount.pyi +4 -0
  59. modal/cls.py +101 -64
  60. modal/cls.pyi +9 -8
  61. modal/config.py +21 -1
  62. modal/container_process.py +288 -12
  63. modal/container_process.pyi +99 -38
  64. modal/dict.py +72 -33
  65. modal/dict.pyi +88 -57
  66. modal/environments.py +16 -8
  67. modal/environments.pyi +6 -2
  68. modal/exception.py +154 -16
  69. modal/experimental/__init__.py +23 -5
  70. modal/experimental/flash.py +161 -74
  71. modal/experimental/flash.pyi +97 -49
  72. modal/file_io.py +50 -92
  73. modal/file_io.pyi +117 -89
  74. modal/functions.pyi +70 -87
  75. modal/image.py +73 -47
  76. modal/image.pyi +33 -30
  77. modal/io_streams.py +500 -149
  78. modal/io_streams.pyi +279 -189
  79. modal/mount.py +60 -45
  80. modal/mount.pyi +41 -17
  81. modal/network_file_system.py +19 -11
  82. modal/network_file_system.pyi +72 -39
  83. modal/object.pyi +114 -22
  84. modal/parallel_map.py +42 -44
  85. modal/parallel_map.pyi +9 -17
  86. modal/partial_function.pyi +4 -2
  87. modal/proxy.py +14 -6
  88. modal/proxy.pyi +10 -2
  89. modal/queue.py +45 -38
  90. modal/queue.pyi +88 -52
  91. modal/runner.py +96 -96
  92. modal/runner.pyi +44 -27
  93. modal/sandbox.py +225 -108
  94. modal/sandbox.pyi +226 -63
  95. modal/secret.py +58 -56
  96. modal/secret.pyi +28 -13
  97. modal/serving.py +7 -11
  98. modal/serving.pyi +7 -8
  99. modal/snapshot.py +29 -15
  100. modal/snapshot.pyi +18 -10
  101. modal/token_flow.py +1 -1
  102. modal/token_flow.pyi +4 -6
  103. modal/volume.py +102 -55
  104. modal/volume.pyi +125 -66
  105. {modal-1.1.5.dev83.dist-info → modal-1.3.1.dev8.dist-info}/METADATA +10 -9
  106. modal-1.3.1.dev8.dist-info/RECORD +189 -0
  107. modal_proto/api.proto +86 -30
  108. modal_proto/api_grpc.py +10 -25
  109. modal_proto/api_pb2.py +1080 -1047
  110. modal_proto/api_pb2.pyi +253 -79
  111. modal_proto/api_pb2_grpc.py +14 -48
  112. modal_proto/api_pb2_grpc.pyi +6 -18
  113. modal_proto/modal_api_grpc.py +175 -176
  114. modal_proto/{sandbox_router.proto → task_command_router.proto} +62 -45
  115. modal_proto/task_command_router_grpc.py +138 -0
  116. modal_proto/task_command_router_pb2.py +180 -0
  117. modal_proto/{sandbox_router_pb2.pyi → task_command_router_pb2.pyi} +110 -63
  118. modal_proto/task_command_router_pb2_grpc.py +272 -0
  119. modal_proto/task_command_router_pb2_grpc.pyi +100 -0
  120. modal_version/__init__.py +1 -1
  121. modal_version/__main__.py +1 -1
  122. modal/cli/programs/launch_instance_ssh.py +0 -94
  123. modal/cli/programs/run_marimo.py +0 -95
  124. modal-1.1.5.dev83.dist-info/RECORD +0 -191
  125. modal_proto/modal_options_grpc.py +0 -3
  126. modal_proto/options.proto +0 -19
  127. modal_proto/options_grpc.py +0 -3
  128. modal_proto/options_pb2.py +0 -35
  129. modal_proto/options_pb2.pyi +0 -20
  130. modal_proto/options_pb2_grpc.py +0 -4
  131. modal_proto/options_pb2_grpc.pyi +0 -7
  132. modal_proto/sandbox_router_grpc.py +0 -105
  133. modal_proto/sandbox_router_pb2.py +0 -148
  134. modal_proto/sandbox_router_pb2_grpc.py +0 -203
  135. modal_proto/sandbox_router_pb2_grpc.pyi +0 -75
  136. {modal-1.1.5.dev83.dist-info → modal-1.3.1.dev8.dist-info}/WHEEL +0 -0
  137. {modal-1.1.5.dev83.dist-info → modal-1.3.1.dev8.dist-info}/entry_points.txt +0 -0
  138. {modal-1.1.5.dev83.dist-info → modal-1.3.1.dev8.dist-info}/licenses/LICENSE +0 -0
  139. {modal-1.1.5.dev83.dist-info → modal-1.3.1.dev8.dist-info}/top_level.txt +0 -0
modal/volume.pyi CHANGED
@@ -265,7 +265,7 @@ class VolumeManager:
265
265
  """
266
266
  ...
267
267
 
268
- create: __create_spec
268
+ create: typing.ClassVar[__create_spec]
269
269
 
270
270
  class __list_spec(typing_extensions.Protocol):
271
271
  def __call__(
@@ -338,7 +338,7 @@ class VolumeManager:
338
338
  """
339
339
  ...
340
340
 
341
- list: __list_spec
341
+ list: typing.ClassVar[__list_spec]
342
342
 
343
343
  class __delete_spec(typing_extensions.Protocol):
344
344
  def __call__(
@@ -401,7 +401,7 @@ class VolumeManager:
401
401
  """
402
402
  ...
403
403
 
404
- delete: __delete_spec
404
+ delete: typing.ClassVar[__delete_spec]
405
405
 
406
406
  class _Volume(modal._object._Object):
407
407
  """A writeable volume that can be used to share files between one or more Modal functions.
@@ -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
 
@@ -596,7 +597,7 @@ class _Volume(modal._object._Object):
596
597
  """
597
598
  ...
598
599
 
599
- def read_file(self, path: str) -> collections.abc.AsyncIterator[bytes]:
600
+ def read_file(self, path: str) -> collections.abc.AsyncGenerator[bytes, None]:
600
601
  """Read a file from the modal.Volume.
601
602
 
602
603
  Note - this function is primarily intended to be used outside of a Modal App.
@@ -626,6 +627,14 @@ class _Volume(modal._object._Object):
626
627
  """
627
628
  ...
628
629
 
630
+ async def _read_file_into_fileobj(
631
+ self,
632
+ path: str,
633
+ fileobj: typing.IO[bytes],
634
+ concurrency: typing.Optional[int] = None,
635
+ download_semaphore: typing.Optional[asyncio.locks.Semaphore] = None,
636
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
637
+ ) -> int: ...
629
638
  async def remove_file(self, path: str, recursive: bool = False) -> None:
630
639
  """Remove a file or directory from a volume."""
631
640
  ...
@@ -657,7 +666,7 @@ class _Volume(modal._object._Object):
657
666
  """
658
667
  ...
659
668
 
660
- async def batch_upload(self, force: bool = False) -> _AbstractVolumeUploadContextManager:
669
+ def batch_upload(self, force: bool = False) -> typing.AsyncContextManager[_AbstractVolumeUploadContextManager]:
661
670
  """Initiate a batched upload to a volume.
662
671
 
663
672
  To allow overwriting existing files, set `force` to `True` (you cannot overwrite existing directories with
@@ -700,8 +709,6 @@ class _Volume(modal._object._Object):
700
709
  environment_name: typing.Optional[str] = None,
701
710
  ): ...
702
711
 
703
- SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
704
-
705
712
  class Volume(modal.object.Object):
706
713
  """A writeable volume that can be used to share files between one or more Modal functions.
707
714
 
@@ -782,11 +789,11 @@ class Volume(modal.object.Object):
782
789
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
783
790
  def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
784
791
 
785
- class ___get_lock_spec(typing_extensions.Protocol[SUPERSELF]):
792
+ class ___get_lock_spec(typing_extensions.Protocol):
786
793
  def __call__(self, /): ...
787
794
  async def aio(self, /): ...
788
795
 
789
- _get_lock: ___get_lock_spec[typing_extensions.Self]
796
+ _get_lock: ___get_lock_spec
790
797
 
791
798
  @property
792
799
  def _is_v1(self) -> bool: ...
@@ -798,6 +805,7 @@ class Volume(modal.object.Object):
798
805
  environment_name: typing.Optional[str] = None,
799
806
  create_if_missing: bool = False,
800
807
  version: typing.Optional[int] = None,
808
+ client: typing.Optional[modal.client.Client] = None,
801
809
  ) -> Volume:
802
810
  """Reference a Volume by name, creating if necessary.
803
811
 
@@ -818,29 +826,56 @@ class Volume(modal.object.Object):
818
826
  """
819
827
  ...
820
828
 
821
- @classmethod
822
- def ephemeral(
823
- cls: type[Volume],
824
- client: typing.Optional[modal.client.Client] = None,
825
- environment_name: typing.Optional[str] = None,
826
- version: typing.Optional[int] = None,
827
- _heartbeat_sleep: float = 300,
828
- ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[Volume]:
829
- """Creates a new ephemeral volume within a context manager:
829
+ class __ephemeral_spec(typing_extensions.Protocol):
830
+ def __call__(
831
+ self,
832
+ /,
833
+ client: typing.Optional[modal.client.Client] = None,
834
+ environment_name: typing.Optional[str] = None,
835
+ version: typing.Optional[int] = None,
836
+ _heartbeat_sleep: float = 300,
837
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[Volume]:
838
+ """Creates a new ephemeral volume within a context manager:
830
839
 
831
- Usage:
832
- ```python
833
- import modal
834
- with modal.Volume.ephemeral() as vol:
835
- assert vol.listdir("/") == []
836
- ```
840
+ Usage:
841
+ ```python
842
+ import modal
843
+ with modal.Volume.ephemeral() as vol:
844
+ assert vol.listdir("/") == []
845
+ ```
837
846
 
838
- ```python notest
839
- async with modal.Volume.ephemeral() as vol:
840
- assert await vol.listdir("/") == []
841
- ```
842
- """
843
- ...
847
+ ```python notest
848
+ async with modal.Volume.ephemeral() as vol:
849
+ assert await vol.listdir("/") == []
850
+ ```
851
+ """
852
+ ...
853
+
854
+ def aio(
855
+ self,
856
+ /,
857
+ client: typing.Optional[modal.client.Client] = None,
858
+ environment_name: typing.Optional[str] = None,
859
+ version: typing.Optional[int] = None,
860
+ _heartbeat_sleep: float = 300,
861
+ ) -> typing.AsyncContextManager[Volume]:
862
+ """Creates a new ephemeral volume within a context manager:
863
+
864
+ Usage:
865
+ ```python
866
+ import modal
867
+ with modal.Volume.ephemeral() as vol:
868
+ assert vol.listdir("/") == []
869
+ ```
870
+
871
+ ```python notest
872
+ async with modal.Volume.ephemeral() as vol:
873
+ assert await vol.listdir("/") == []
874
+ ```
875
+ """
876
+ ...
877
+
878
+ ephemeral: typing.ClassVar[__ephemeral_spec]
844
879
 
845
880
  class __create_deployed_spec(typing_extensions.Protocol):
846
881
  def __call__(
@@ -867,7 +902,7 @@ class Volume(modal.object.Object):
867
902
  """mdmd:hidden"""
868
903
  ...
869
904
 
870
- create_deployed: __create_deployed_spec
905
+ create_deployed: typing.ClassVar[__create_deployed_spec]
871
906
 
872
907
  class ___create_deployed_spec(typing_extensions.Protocol):
873
908
  def __call__(
@@ -894,9 +929,9 @@ class Volume(modal.object.Object):
894
929
  """mdmd:hidden"""
895
930
  ...
896
931
 
897
- _create_deployed: ___create_deployed_spec
932
+ _create_deployed: typing.ClassVar[___create_deployed_spec]
898
933
 
899
- class __info_spec(typing_extensions.Protocol[SUPERSELF]):
934
+ class __info_spec(typing_extensions.Protocol):
900
935
  def __call__(self, /) -> VolumeInfo:
901
936
  """Return information about the Volume object."""
902
937
  ...
@@ -905,15 +940,15 @@ class Volume(modal.object.Object):
905
940
  """Return information about the Volume object."""
906
941
  ...
907
942
 
908
- info: __info_spec[typing_extensions.Self]
943
+ info: __info_spec
909
944
 
910
- class ___do_reload_spec(typing_extensions.Protocol[SUPERSELF]):
945
+ class ___do_reload_spec(typing_extensions.Protocol):
911
946
  def __call__(self, /, lock=True): ...
912
947
  async def aio(self, /, lock=True): ...
913
948
 
914
- _do_reload: ___do_reload_spec[typing_extensions.Self]
949
+ _do_reload: ___do_reload_spec
915
950
 
916
- class __commit_spec(typing_extensions.Protocol[SUPERSELF]):
951
+ class __commit_spec(typing_extensions.Protocol):
917
952
  def __call__(self, /):
918
953
  """Commit changes to a mounted volume.
919
954
 
@@ -930,9 +965,9 @@ class Volume(modal.object.Object):
930
965
  """
931
966
  ...
932
967
 
933
- commit: __commit_spec[typing_extensions.Self]
968
+ commit: __commit_spec
934
969
 
935
- class __reload_spec(typing_extensions.Protocol[SUPERSELF]):
970
+ class __reload_spec(typing_extensions.Protocol):
936
971
  def __call__(self, /):
937
972
  """Make latest committed state of volume available in the running container.
938
973
 
@@ -953,9 +988,9 @@ class Volume(modal.object.Object):
953
988
  """
954
989
  ...
955
990
 
956
- reload: __reload_spec[typing_extensions.Self]
991
+ reload: __reload_spec
957
992
 
958
- class __iterdir_spec(typing_extensions.Protocol[SUPERSELF]):
993
+ class __iterdir_spec(typing_extensions.Protocol):
959
994
  def __call__(self, /, path: str, *, recursive: bool = True) -> typing.Iterator[FileEntry]:
960
995
  """Iterate over all files in a directory in the volume.
961
996
 
@@ -974,9 +1009,9 @@ class Volume(modal.object.Object):
974
1009
  """
975
1010
  ...
976
1011
 
977
- iterdir: __iterdir_spec[typing_extensions.Self]
1012
+ iterdir: __iterdir_spec
978
1013
 
979
- class __listdir_spec(typing_extensions.Protocol[SUPERSELF]):
1014
+ class __listdir_spec(typing_extensions.Protocol):
980
1015
  def __call__(self, /, path: str, *, recursive: bool = False) -> list[FileEntry]:
981
1016
  """List all files under a path prefix in the modal.Volume.
982
1017
 
@@ -995,10 +1030,10 @@ class Volume(modal.object.Object):
995
1030
  """
996
1031
  ...
997
1032
 
998
- listdir: __listdir_spec[typing_extensions.Self]
1033
+ listdir: __listdir_spec
999
1034
 
1000
- class __read_file_spec(typing_extensions.Protocol[SUPERSELF]):
1001
- def __call__(self, /, path: str) -> typing.Iterator[bytes]:
1035
+ class __read_file_spec(typing_extensions.Protocol):
1036
+ def __call__(self, /, path: str) -> typing.Generator[bytes, None, None]:
1002
1037
  """Read a file from the modal.Volume.
1003
1038
 
1004
1039
  Note - this function is primarily intended to be used outside of a Modal App.
@@ -1017,7 +1052,7 @@ class Volume(modal.object.Object):
1017
1052
  """
1018
1053
  ...
1019
1054
 
1020
- def aio(self, /, path: str) -> collections.abc.AsyncIterator[bytes]:
1055
+ def aio(self, /, path: str) -> collections.abc.AsyncGenerator[bytes, None]:
1021
1056
  """Read a file from the modal.Volume.
1022
1057
 
1023
1058
  Note - this function is primarily intended to be used outside of a Modal App.
@@ -1036,9 +1071,9 @@ class Volume(modal.object.Object):
1036
1071
  """
1037
1072
  ...
1038
1073
 
1039
- read_file: __read_file_spec[typing_extensions.Self]
1074
+ read_file: __read_file_spec
1040
1075
 
1041
- class __read_file_into_fileobj_spec(typing_extensions.Protocol[SUPERSELF]):
1076
+ class __read_file_into_fileobj_spec(typing_extensions.Protocol):
1042
1077
  def __call__(
1043
1078
  self,
1044
1079
  /,
@@ -1063,9 +1098,31 @@ class Volume(modal.object.Object):
1063
1098
  """
1064
1099
  ...
1065
1100
 
1066
- read_file_into_fileobj: __read_file_into_fileobj_spec[typing_extensions.Self]
1101
+ read_file_into_fileobj: __read_file_into_fileobj_spec
1067
1102
 
1068
- class __remove_file_spec(typing_extensions.Protocol[SUPERSELF]):
1103
+ class ___read_file_into_fileobj_spec(typing_extensions.Protocol):
1104
+ def __call__(
1105
+ self,
1106
+ /,
1107
+ path: str,
1108
+ fileobj: typing.IO[bytes],
1109
+ concurrency: typing.Optional[int] = None,
1110
+ download_semaphore: typing.Optional[asyncio.locks.Semaphore] = None,
1111
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
1112
+ ) -> int: ...
1113
+ async def aio(
1114
+ self,
1115
+ /,
1116
+ path: str,
1117
+ fileobj: typing.IO[bytes],
1118
+ concurrency: typing.Optional[int] = None,
1119
+ download_semaphore: typing.Optional[asyncio.locks.Semaphore] = None,
1120
+ progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
1121
+ ) -> int: ...
1122
+
1123
+ _read_file_into_fileobj: ___read_file_into_fileobj_spec
1124
+
1125
+ class __remove_file_spec(typing_extensions.Protocol):
1069
1126
  def __call__(self, /, path: str, recursive: bool = False) -> None:
1070
1127
  """Remove a file or directory from a volume."""
1071
1128
  ...
@@ -1074,9 +1131,9 @@ class Volume(modal.object.Object):
1074
1131
  """Remove a file or directory from a volume."""
1075
1132
  ...
1076
1133
 
1077
- remove_file: __remove_file_spec[typing_extensions.Self]
1134
+ remove_file: __remove_file_spec
1078
1135
 
1079
- class __copy_files_spec(typing_extensions.Protocol[SUPERSELF]):
1136
+ class __copy_files_spec(typing_extensions.Protocol):
1080
1137
  def __call__(self, /, src_paths: collections.abc.Sequence[str], dst_path: str, recursive: bool = False) -> None:
1081
1138
  """Copy files within the volume from src_paths to dst_path.
1082
1139
  The semantics of the copy operation follow those of the UNIX cp command.
@@ -1129,10 +1186,12 @@ class Volume(modal.object.Object):
1129
1186
  """
1130
1187
  ...
1131
1188
 
1132
- copy_files: __copy_files_spec[typing_extensions.Self]
1189
+ copy_files: __copy_files_spec
1133
1190
 
1134
- class __batch_upload_spec(typing_extensions.Protocol[SUPERSELF]):
1135
- def __call__(self, /, force: bool = False) -> AbstractVolumeUploadContextManager:
1191
+ class __batch_upload_spec(typing_extensions.Protocol):
1192
+ def __call__(
1193
+ self, /, force: bool = False
1194
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[AbstractVolumeUploadContextManager]:
1136
1195
  """Initiate a batched upload to a volume.
1137
1196
 
1138
1197
  To allow overwriting existing files, set `force` to `True` (you cannot overwrite existing directories with
@@ -1151,7 +1210,7 @@ class Volume(modal.object.Object):
1151
1210
  """
1152
1211
  ...
1153
1212
 
1154
- async def aio(self, /, force: bool = False) -> AbstractVolumeUploadContextManager:
1213
+ def aio(self, /, force: bool = False) -> typing.AsyncContextManager[AbstractVolumeUploadContextManager]:
1155
1214
  """Initiate a batched upload to a volume.
1156
1215
 
1157
1216
  To allow overwriting existing files, set `force` to `True` (you cannot overwrite existing directories with
@@ -1170,13 +1229,13 @@ class Volume(modal.object.Object):
1170
1229
  """
1171
1230
  ...
1172
1231
 
1173
- batch_upload: __batch_upload_spec[typing_extensions.Self]
1232
+ batch_upload: __batch_upload_spec
1174
1233
 
1175
- class ___instance_delete_spec(typing_extensions.Protocol[SUPERSELF]):
1234
+ class ___instance_delete_spec(typing_extensions.Protocol):
1176
1235
  def __call__(self, /): ...
1177
1236
  async def aio(self, /): ...
1178
1237
 
1179
- _instance_delete: ___instance_delete_spec[typing_extensions.Self]
1238
+ _instance_delete: ___instance_delete_spec
1180
1239
 
1181
1240
  class __delete_spec(typing_extensions.Protocol):
1182
1241
  def __call__(
@@ -1213,7 +1272,7 @@ class Volume(modal.object.Object):
1213
1272
  """
1214
1273
  ...
1215
1274
 
1216
- delete: __delete_spec
1275
+ delete: typing.ClassVar[__delete_spec]
1217
1276
 
1218
1277
  class __rename_spec(typing_extensions.Protocol):
1219
1278
  def __call__(
@@ -1235,7 +1294,7 @@ class Volume(modal.object.Object):
1235
1294
  environment_name: typing.Optional[str] = None,
1236
1295
  ): ...
1237
1296
 
1238
- rename: __rename_spec
1297
+ rename: typing.ClassVar[__rename_spec]
1239
1298
 
1240
1299
  class _AbstractVolumeUploadContextManager:
1241
1300
  async def __aenter__(self): ...
@@ -1395,11 +1454,11 @@ class VolumeUploadContextManager(AbstractVolumeUploadContextManager):
1395
1454
  """
1396
1455
  ...
1397
1456
 
1398
- class ___upload_file_spec(typing_extensions.Protocol[SUPERSELF]):
1457
+ class ___upload_file_spec(typing_extensions.Protocol):
1399
1458
  def __call__(self, /, file_spec: modal._utils.blob_utils.FileUploadSpec) -> modal_proto.api_pb2.MountFile: ...
1400
1459
  async def aio(self, /, file_spec: modal._utils.blob_utils.FileUploadSpec) -> modal_proto.api_pb2.MountFile: ...
1401
1460
 
1402
- _upload_file: ___upload_file_spec[typing_extensions.Self]
1461
+ _upload_file: ___upload_file_spec
1403
1462
 
1404
1463
  class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
1405
1464
  """Context manager for batch-uploading files to a Volume version 2."""
@@ -1519,11 +1578,11 @@ class VolumeUploadContextManager2(AbstractVolumeUploadContextManager):
1519
1578
  """
1520
1579
  ...
1521
1580
 
1522
- class ___put_file_specs_spec(typing_extensions.Protocol[SUPERSELF]):
1581
+ class ___put_file_specs_spec(typing_extensions.Protocol):
1523
1582
  def __call__(self, /, file_specs: list[modal._utils.blob_utils.FileUploadSpec2]): ...
1524
1583
  async def aio(self, /, file_specs: list[modal._utils.blob_utils.FileUploadSpec2]): ...
1525
1584
 
1526
- _put_file_specs: ___put_file_specs_spec[typing_extensions.Self]
1585
+ _put_file_specs: ___put_file_specs_spec
1527
1586
 
1528
1587
  async def _put_missing_blocks(
1529
1588
  file_specs: list[modal._utils.blob_utils.FileUploadSpec2],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev83
3
+ Version: 1.3.1.dev8
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -13,17 +13,18 @@ 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.15,>=3.10
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
19
  Requires-Dist: aiohttp
20
20
  Requires-Dist: cbor2
21
21
  Requires-Dist: certifi
22
22
  Requires-Dist: click~=8.1
23
- Requires-Dist: grpclib<0.4.9,>=0.4.7
23
+ Requires-Dist: grpclib<0.4.10,>=0.4.7; python_version < "3.14"
24
+ Requires-Dist: grpclib<0.4.10,>=0.4.9; python_version >= "3.14"
24
25
  Requires-Dist: protobuf!=4.24.0,<7.0,>=3.19
25
26
  Requires-Dist: rich>=12.0.0
26
- Requires-Dist: synchronicity~=0.10.2
27
+ Requires-Dist: synchronicity~=0.11.1
27
28
  Requires-Dist: toml
28
29
  Requires-Dist: typer>=0.9
29
30
  Requires-Dist: types-certifi
@@ -32,14 +33,14 @@ Requires-Dist: watchfiles
32
33
  Requires-Dist: typing_extensions~=4.6
33
34
  Dynamic: license-file
34
35
 
35
- # Modal Python Library
36
+ # Modal Python SDK
36
37
 
37
38
  [![PyPI Version](https://img.shields.io/pypi/v/modal.svg)](https://pypi.org/project/modal/)
38
39
  [![License](https://img.shields.io/badge/license-apache_2.0-darkviolet.svg)](https://github.com/modal-labs/modal-client/blob/master/LICENSE)
39
40
  [![Tests](https://github.com/modal-labs/modal-client/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/modal-labs/modal-client/actions/workflows/ci-cd.yml)
40
41
  [![Slack](https://img.shields.io/badge/slack-join-blue.svg?logo=slack)](https://modal.com/slack)
41
42
 
42
- The [Modal](https://modal.com/) Python library provides convenient, on-demand
43
+ The [Modal](https://modal.com/) Python SDK provides convenient, on-demand
43
44
  access to serverless cloud compute from Python scripts on your local computer.
44
45
 
45
46
  ## Documentation
@@ -51,12 +52,12 @@ a [user guide](https://modal.com/docs/guide), and the detailed
51
52
 
52
53
  ## Installation
53
54
 
54
- **This library requires Python 3.9 – 3.13.**
55
+ **This library requires Python 3.10 – 3.14.**
55
56
 
56
- Install the package with `pip`:
57
+ Install the package with `uv` or `pip`:
57
58
 
58
59
  ```bash
59
- pip install modal
60
+ uv pip install modal
60
61
  ```
61
62
 
62
63
  You can create a Modal account (or link your existing one) directly on the
@@ -0,0 +1,189 @@
1
+ modal/__init__.py,sha256=K84VA1KG2BCeg_rF47a1QXE3H_uunFmYJmyFZ-2TrYU,2684
2
+ modal/__main__.py,sha256=UTyagD6NHFl3hdmKVr4yXGGB5_Gzj3NjrpuTIwJ25Tw,1597
3
+ modal/_billing.py,sha256=plJei3pEERVQMc_r7GvN1OKT9GAFdrI8Jl4biDw2CXY,3170
4
+ modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA,2884
5
+ modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
+ modal/_container_entrypoint.py,sha256=aatoboeM3fe9w7DVdCgVOhW4iW9EwduZwiVS3ri0HgA,19787
7
+ modal/_functions.py,sha256=RlcQdwVkN6IB-7XRzhW3Kh3KX79vLL3yVmrhv-2GuGE,92173
8
+ modal/_grpc_client.py,sha256=G8gWQXChtsuRgyXK9kcPiPNYXOYbl_m9Bz2AVBJb-zs,6924
9
+ modal/_ipython.py,sha256=Bu9fc3hm3xt2O47qLe_d-Mu2jS81LwMsmXNJ1sawBA0,575
10
+ modal/_load_context.py,sha256=P7bMvu-_E1YXWhunYU46EqQX78r4D3b05YGz9blSsy8,3786
11
+ modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
12
+ modal/_object.py,sha256=-LgLXdWlSQ2V-UhmKgswBE7uLTy7E6KgJmV1G4loCMw,13726
13
+ modal/_output.py,sha256=pKRLDyoEXjLe-oV12-hb6gYOpdUmNzrq7FQna-maC70,26832
14
+ modal/_partial_function.py,sha256=xRaU_A5SE30jywgU_-S1kV2y9WUrm0S906T5OWpS2Vg,38684
15
+ modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
16
+ modal/_resolver.py,sha256=01fdEP-ujXlw2LG0sthPqanm3b0DAiRG81xiQcHHkhY,7317
17
+ modal/_resources.py,sha256=NMAp0GCLutiZI4GuKSIVnRHVlstoD3hNGUabjTUtzf4,1794
18
+ modal/_serialization.py,sha256=Yc4czrt8x3xkX43oJngb7BSI4zPgtBVuifYrxTCdsAQ,26451
19
+ modal/_traceback.py,sha256=N0EumYnHHqPHkmP2L6cJKjTpoxc8QYmiofROmdgSthQ,6238
20
+ modal/_tunnel.py,sha256=bbjVuWiDyC3m_NaVBpgoNQte-NM1FUtDVQsMobQbhc8,6578
21
+ modal/_tunnel.pyi,sha256=FoedJzHymbPk4Bmnbszm6uhay2rMq1JS9mIiHELYf3k,13804
22
+ modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
23
+ modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
24
+ modal/app.py,sha256=ls8RTBz5yeMWCFtUAPzy8U2ZgRpQEsDBRq_WY8t1vqg,59449
25
+ modal/app.pyi,sha256=WR0nGSUh8-8OYRHFqEnijGoPp_IbawNY1JW_0pozXsE,50857
26
+ modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
27
+ modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
+ modal/client.py,sha256=CXnyJYLhY--xaCkjv3tpjYDca8AuXGQG1IiaXQVX4y4,14436
29
+ modal/client.pyi,sha256=cL-0qiU8AREPuoSWORpDQ_2-gQ4tzXOTiGDWNxDVaiE,14471
30
+ modal/cloud_bucket_mount.py,sha256=cvVj5Rt4nDHoQbTneoJPTaAcnl_Ab_mrsjnnzd0v9OI,6013
31
+ modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
+ modal/cls.py,sha256=Cmqt1vOw0-01ktjJBOrdzvdyDbHpjKMTaZ2eEy_8YUE,41694
33
+ modal/cls.pyi,sha256=ZsJBwboZJ95wqgQUFi2VB6etbDXrmMPwJ61c-r8T2kY,27262
34
+ modal/config.py,sha256=JvNf4jr5xRLlFgIp4l38z1CJQyDxOHc_DnPOAYCJGvE,13516
35
+ modal/container_process.py,sha256=xMJ93EeBcI-BoGDv78-a0UEbvSza-ye_TFi5fpGAxbw,16777
36
+ modal/container_process.pyi,sha256=jyV3WIkTn2NsXqAFf5Jseciz2mdq_sjO9zQMoJnquIg,8211
37
+ modal/dict.py,sha256=9tyzgvLLribY5dJAC5n8_kiF5GNZTr0QD35LuEtYgC4,22664
38
+ modal/dict.pyi,sha256=1g6wUpLESOsSecE9oLiu61wg9wOhl5t1e0jX0qHqkJQ,32381
39
+ modal/environments.py,sha256=wMiMNpPkvIl_BdxRb81CY9Djzhczp_y4GEYKWp0JyBc,6135
40
+ modal/environments.pyi,sha256=bMIxvwahckgaolGD3-hP2iovRHDXewvgbVs_nx4ze0o,3808
41
+ modal/exception.py,sha256=T_yVtqe2B-fXy57qd-3Pk90nqGXq9T7FJElEEPHdC5g,10435
42
+ modal/file_io.py,sha256=dx90C5L8cQv2Z7pVVPaQmE0R3pUOGv2h-wn1qNNXbGQ,19818
43
+ modal/file_io.pyi,sha256=up9OhV2Y54n-X7nlfV6j_eBwJ8D2cNMEswZ1iddrEQw,15877
44
+ modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
45
+ modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
46
+ modal/functions.pyi,sha256=fkjxeYAqh6sX9C84gjUGoLVgHT1IfNB_07h0fpmIyWw,36465
47
+ modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
48
+ modal/image.py,sha256=sPaYxx4Dwdod1FjVooDaDDcPbcyyBXY4ChpbQvWe5mc,108197
49
+ modal/image.pyi,sha256=UMwAaYu4feSDzJS9l-5xKYP_yaJm18bY_s3pREOQF6A,78249
50
+ modal/io_streams.py,sha256=g6H6QAl48qZtN5OY6WIIVwF9TXBj3jMNYCgn7RYYrVg,30697
51
+ modal/io_streams.pyi,sha256=aBxCcbHTprL08FLvPlkzu4bypCTT7xUdelNe5kc7OZY,18506
52
+ modal/mount.py,sha256=5ps0p8dik2McxetRfHakLouzOvBrQPYBFCUCrgNlXik,33856
53
+ modal/mount.pyi,sha256=ISBxzudOyLvw5r2LtzYm6Bh_wMUHrVAans8-u33k8cY,15721
54
+ modal/network_file_system.py,sha256=23GUYz2DZ5kCzlUrdWBq1siBse6fP_CeGt2Lo9xHkR8,13598
55
+ modal/network_file_system.pyi,sha256=oRQzPxSF3ZmY8BDtBFU3CCyGwPLl5jkobtN6ekexLog,16161
56
+ modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
57
+ modal/object.pyi,sha256=IiWqkhIVNryH9mbpOpZiG21W9UWW5T7l8gf98J3fVIk,10088
58
+ modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
59
+ modal/parallel_map.py,sha256=VAfhkgCKFXtpba01Dvq7kc-xg5nlP-AdvmJW0LoyfD8,68670
60
+ modal/parallel_map.pyi,sha256=CPX8c8sxCGjrMGFYdm6u8x28b9T2UnW96O2dRbiqWPI,15426
61
+ modal/partial_function.py,sha256=aIdlGfTjjgqY6Fpr-biCjvRU9W542_S5N2xkNN_rYGM,1127
62
+ modal/partial_function.pyi,sha256=ESpPy_ziWJSI6zX0aaiN6oglpx8USmeMO_z27isXaIY,13996
63
+ modal/proxy.py,sha256=zIe_ZMAeRu9dgU9FKwZqpvCFTNwLLwIC0Vra4ZZfz1I,1737
64
+ modal/proxy.pyi,sha256=05HihJqRRJydYQSjLMYs9-mxdvzq4OUpKg3PAfrBppo,1597
65
+ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
+ modal/queue.py,sha256=DGqXKEY0B4yyV_bN_XSmwIM50T9VZLu6RYzH_hh-KRg,25719
67
+ modal/queue.pyi,sha256=EtdH62gzf3o_s831FH2dir5Bxoif7YtJjx-cnjmbGcg,37866
68
+ modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
69
+ modal/runner.py,sha256=T-QUi4IykPxCu6TqzJtBdqQvwiIuysstaAL01SEQ9tA,25592
70
+ modal/runner.pyi,sha256=HYBi04nUrZN9-L-cTlvDDHFiJS-N6M3usKk1_QzGnpc,8736
71
+ modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
72
+ modal/sandbox.py,sha256=qmtpyUxtVPjNNiaCoIHZW9fic0Wq2sGTDdrD2Q4uHNI,50811
73
+ modal/sandbox.pyi,sha256=B7VwuwumUuvVDxwHFPAmJFmxXGUOfdwJTUxBRBFLIv0,57454
74
+ modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
75
+ modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
76
+ modal/secret.py,sha256=XOHgwhjPJpzsIe7eo3DGAQ66hvyepc232UEEAREnjtk,18203
77
+ modal/secret.pyi,sha256=wzGS_qOE0YwmoXvxWT5FyzKlTYS4wPFblbqDSuXRnoY,21016
78
+ modal/serving.py,sha256=rfzj23Q4hPSMpc3vj_cQg3awkZULu4hLtRs83cOEB-w,4291
79
+ modal/serving.pyi,sha256=eNqF_bhO_JQ0EDpqvSjSUdNs48vv7AcPXinp7GEs5wI,1966
80
+ modal/snapshot.py,sha256=vIKxA1XRRsH8cFcpSUqC9M8NccKIaYaDpmiEC2clNks,2297
81
+ modal/snapshot.pyi,sha256=vMYDx1s9Ds4qtH-PXgB_9RzVuS5wsTchVcclR5Q-mmM,2014
82
+ modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
83
+ modal/token_flow.py,sha256=tLvBE9OT50p8AnYYh4b5MvBMQc1vV1-6C0GsmyFDfxw,7626
84
+ modal/token_flow.pyi,sha256=xxMmxKU2_Z8aLhQazqhnBng8PVPKaPgZXKnUuS5WykI,2406
85
+ modal/volume.py,sha256=vej3tMfs0ayarcp2Y3wsDnStJdnQ6u2U8VKYQi7YTn8,52733
86
+ modal/volume.pyi,sha256=lrfm3p_IvWysX0OItHpsti7v9yJN1JA1XtGQrXOT1AM,53915
87
+ modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
88
+ modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
89
+ modal/_runtime/container_io_manager.py,sha256=EQF1aAtzb0A2chhr0B8es_G0rawbBUKZaFu0-p6dsQU,52102
90
+ modal/_runtime/container_io_manager.pyi,sha256=qwnmErhulV_2OYRWbw8wM3vw6r2Pub1W98NccrKrXaY,22701
91
+ modal/_runtime/execution_context.py,sha256=AYrNQRHHXEqX2MwMf8zxelKZnYf25RE_B-NRLWf93n8,3521
92
+ modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdgWuU4W9k,2426
93
+ modal/_runtime/gpu_memory_snapshot.py,sha256=vRLzSVZckD7xYjahrXlRPExuoOdDwTTKIaEMsWDTrzM,12113
94
+ modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
95
+ modal/_runtime/user_code_event_loop.py,sha256=HwOuDyCZLOakr_DG7p2MrcscjSQNheIhBBuLgB5I3Cc,3014
96
+ modal/_runtime/user_code_imports.py,sha256=_6uHDfTpqCcspHpgjNV14uMyiGdWkAHU7zqHfUx9uzU,25997
97
+ modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
98
+ modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
99
+ modal/_utils/async_utils.py,sha256=2KQs7W2OwU6-5wxCoYbkt8_sLocDDQSyyBbb1gulZ20,43322
100
+ modal/_utils/auth_token_manager.py,sha256=QsDokl1c1dN9m6Z9N-Se-8cY3laphByjJtNdRXUTieI,5151
101
+ modal/_utils/blob_utils.py,sha256=LIWNN7w0ma5IG1rP3gaOrn6YKcGTXMbI1_rSpJay8pY,23147
102
+ modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
103
+ modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
104
+ modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
105
+ modal/_utils/function_utils.py,sha256=uoOcn_pyl6fOVHr_Q6ci1_5eJqo90so7G9izfs-T-As,28272
106
+ modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
107
+ modal/_utils/grpc_testing.py,sha256=fZLyfMA5VYmIo-dUCcKQrVCH3ZKPT7K4_6ww373jt0Y,8697
108
+ modal/_utils/grpc_utils.py,sha256=8KxNd8M8ziVTc-FB2mkmesBG9hscJScjjL0VIUB4T8k,16270
109
+ modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,3034
110
+ modal/_utils/http_utils.py,sha256=yeTFsXYr0rYMEhB7vBP7audG9Uc7OLhzKBANFDZWVt0,2451
111
+ modal/_utils/jwt_utils.py,sha256=fxH9plyrbAemTbjSsQtzIdDXE9QXxvMC4DiUZ16G0aA,1360
112
+ modal/_utils/logger.py,sha256=NgbMKFT9chYYt_TU01DdIior5ByYr2gZtrWIk1SFRLc,1782
113
+ modal/_utils/mount_utils.py,sha256=3v6wbSvEjOhIlnLGbyXKOzdoXaG-FwNAZ_Rr0io_v2o,4113
114
+ modal/_utils/name_utils.py,sha256=CIQL0Y4z47tq0rfNL2Kdo5dxsGrxoN2hR9Ko0HapeE4,2517
115
+ modal/_utils/package_utils.py,sha256=jYE7WFVzYWIfO0ZJhno_BYHb6Skp48uupOiw1a3yWzw,2056
116
+ modal/_utils/pattern_utils.py,sha256=ZUffaECfe2iYBhH6cvCB-0-UWhmEBTZEl_TwG_So3ag,6714
117
+ modal/_utils/rand_pb_testing.py,sha256=oNtQB1BY9CDh7vDXEkJitCuCu9a2ufk0KRcEuZ15d0k,4229
118
+ modal/_utils/shell_utils.py,sha256=hWHzv730Br2Xyj6cGPiMZ-198Z3RZuOu3pDXhFSZ22c,2157
119
+ modal/_utils/task_command_router_client.py,sha256=-5ZYVBZj0mQLA2Nul2o_XSEM5xV0hrzLziP4v6SZPiI,23219
120
+ modal/_utils/time_utils.py,sha256=43tpFVwT7ykOjlETIFLVt9auMsRZqYYRYBEKxGCrRSA,1212
121
+ modal/_vendor/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
122
+ modal/_vendor/a2wsgi_wsgi.py,sha256=Q1AsjpV_Q_vzQsz_cSqmP9jWzsGsB-ARFU6vpQYml8k,21878
123
+ modal/_vendor/cloudpickle.py,sha256=N0PN-AwRn3GWGVWBdr1rYcgKVzLOk66oz0hBSjocG4o,59166
124
+ modal/_vendor/tblib.py,sha256=g1O7QUDd3sDoLd8YPFltkXkih7r_fyZOjgmGuligv3s,9722
125
+ modal/builder/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u1eTYw,400
126
+ modal/builder/2023.12.txt,sha256=OjsbXFkCSdkzzryZP82Q73osr5wxQ6EUzmGcK7twfkA,502
127
+ modal/builder/2024.04.txt,sha256=6NnrbIE-mflwMyKyQ0tsWeY8XFE1kSW9oE8DVDoD8QU,544
128
+ modal/builder/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
129
+ modal/builder/2025.06.txt,sha256=Ml51O7e_6GXpgYHI3Vn4c7N4xAYbaThAF-i31BqwdAk,532
130
+ modal/builder/PREVIEW.txt,sha256=ScSScM_BQcdcfTUJB2pMUyNw4_krm4pYkoZfMuxMRVk,393
131
+ modal/builder/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
132
+ modal/builder/base-images.json,sha256=9zgY2-a2U_iEBBe60VNLQvErJQosRhQuXXRqcG6mHGg,1348
133
+ modal/cli/__init__.py,sha256=6FRleWQxBDT19y7OayO4lBOzuL6Bs9r0rLINYYYbHwQ,769
134
+ modal/cli/_download.py,sha256=_Q_CG1Qb4cjVSAwHGGPOPoNTsmK9gHvF-HNWCNdFjaY,4900
135
+ modal/cli/_traceback.py,sha256=IKj9xtc6LjAxyhGJWolNIXEX3MhAIulnRqywZNOFmkU,7324
136
+ modal/cli/app.py,sha256=rbuAG92my-1eZN0olk6p2eD4oBnyBliUsrCOUW-U-9k,7832
137
+ modal/cli/cluster.py,sha256=BLcKDpwpDmlqE2UC4V0qNpJKiQ-ZXfI9g_SE7u6vnIU,3347
138
+ modal/cli/config.py,sha256=7xgglsSf5pKfE7ZLz-uZf9S11NBuNbUkUbcZ5nFk8Y0,1721
139
+ modal/cli/container.py,sha256=meFH-T_Bdyd7a9HjClzGCgYuPq0KhWs_HUUsSW12HjM,3686
140
+ modal/cli/dict.py,sha256=8aVWjxdmsPznYNMNYYkKHtrJSEREGc_H21g1hTHa0FM,4686
141
+ modal/cli/entry_point.py,sha256=aaofRsA9c4s68CVbXehzmLilJWLBUL2DXLh--lTVYRQ,5816
142
+ modal/cli/environment.py,sha256=AKgtjzFkTxAOlWAZC6uHsZro_y2jfeugL0r8bXHw4Ic,3904
143
+ modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
144
+ modal/cli/launch.py,sha256=1inePjuiqV3HHwk0H-Lk-UAxhkoodCwFoRswD_dat2U,3840
145
+ modal/cli/network_file_system.py,sha256=AOT24KkYEM3YaHIPIZGe8SsA4-mDyj50o9HNwDsHiaE,7664
146
+ modal/cli/profile.py,sha256=g8X6tFFK9ccKyu2he9Yu19WLSLNdztzECgmIV__XJFs,3257
147
+ modal/cli/queues.py,sha256=S5dqk6lEd_2fJolHqoN9iRs6EkeTa0k7KqJWBBGS23k,6170
148
+ modal/cli/run.py,sha256=j0NJqxZrfPikpuIjLtQV9dwi2GK3rUHcr6_BJabZXBQ,18728
149
+ modal/cli/secret.py,sha256=zkCztov8c4x8CI8G0EoyieUfv9XLQQtVXV8xeMLK-Os,8044
150
+ modal/cli/shell.py,sha256=L5Dw8yeuu9-f6vNlBGbUT4oh9AVSK4GuB5J6m6vYLBk,12613
151
+ modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
152
+ modal/cli/utils.py,sha256=d7J4j29b6bsj2GqYe3QdqgHpO-QkxcjtF9YnRCYxVIg,2879
153
+ modal/cli/volume.py,sha256=8_wjfaFmtcPrIYx46__CbCefaSLPJ14nlm6iCLz_HOA,10512
154
+ modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
155
+ modal/cli/programs/run_jupyter.py,sha256=IJw8nds8Cjl9j4dxBqMGxhz-bIyVX0kle7jbt8HFOhM,2688
156
+ modal/cli/programs/vscode.py,sha256=E1aJPU7b8RWWj-JX71DifsCoLYsCAnre7lATiBJjUms,3386
157
+ modal/experimental/__init__.py,sha256=GOuo3t4-Le0ZVddiHIOw0MQxkdTJge-bVbhDvgnblmQ,14573
158
+ modal/experimental/flash.py,sha256=GJZwSr-4OHlP6gCIZdcbsSb8D8WX9xJwMphjwcfsRoU,31262
159
+ modal/experimental/flash.pyi,sha256=W62a0AhmLUuH9a0n8Y3-DYhyEEFH3-bRUQFphOQfKHg,16418
160
+ modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
161
+ modal-1.3.1.dev8.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
162
+ modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
163
+ modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
164
+ modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
165
+ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
166
+ modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
167
+ modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
168
+ modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
169
+ modal_proto/api.proto,sha256=rCVrHKcB6QWjaALTGasjPr6En10CCWTWHSEYAMbkslk,111165
170
+ modal_proto/api_grpc.py,sha256=-8SHvPtalTAjQtRv7zzU7Z1VoDupoJs2ifG4gl_mF0s,134442
171
+ modal_proto/api_pb2.py,sha256=DfSnuy7cKJ6e6udu22xKoVQyoF0d0aod0U-_za9j7ZE,384579
172
+ modal_proto/api_pb2.pyi,sha256=4jfkVV0jZDsIVkoEaffdkRnrjwy_rxiYsy1LKAIKzzQ,543056
173
+ modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,289714
174
+ modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
175
+ modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
176
+ modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
+ modal_proto/task_command_router.proto,sha256=oyHT02Ck7jrBe55s4ge5f2ko58-2sg3gZ-xEvvn5bXU,5620
178
+ modal_proto/task_command_router_grpc.py,sha256=_K9lOLOB_pyT8-XvGnicgAIW1aLVFTqQISmP7Q1x4e8,6962
179
+ modal_proto/task_command_router_pb2.py,sha256=2Y8wRvnq4_7RiQ-5ZAPIgXaxrHv_MXzgS5wyWVJmQTo,13107
180
+ modal_proto/task_command_router_pb2.pyi,sha256=yI4tFteErLlonFA2HyaWtONfhY_VGSe7KCWFIspvmkE,16323
181
+ modal_proto/task_command_router_pb2_grpc.py,sha256=q2VWfK2-4uDcPaPLhAqPZkgxhuQRYnWmwUcnEbPbGuk,13895
182
+ modal_proto/task_command_router_pb2_grpc.pyi,sha256=e1MM10VGUgDkm041v53QeTglGQPzTpA0FUsFtezjp74,4536
183
+ modal_version/__init__.py,sha256=09igZ6kO7zTS-MQTRIsbU4NSUdt5oJIlPZx-kYGhH2M,120
184
+ modal_version/__main__.py,sha256=nLUbubxKx7GXNzJIkTB7M7_u8080LyLM0IS0rzFkC_c,119
185
+ modal-1.3.1.dev8.dist-info/METADATA,sha256=4FYfdjmdPWtRcLeH4ChhNszpN9QQ_f1Lz3nJbuuOK2Y,2581
186
+ modal-1.3.1.dev8.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
187
+ modal-1.3.1.dev8.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
188
+ modal-1.3.1.dev8.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
189
+ modal-1.3.1.dev8.dist-info/RECORD,,