modAL 1.2.7.dev6__py3-none-any.whl → 1.2.7.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
modal/_functions.py CHANGED
@@ -694,7 +694,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
694
694
  # Experimental: Clustered functions
695
695
  cluster_size: Optional[int] = None,
696
696
  rdma: Optional[bool] = None,
697
- max_inputs: Optional[int] = None,
697
+ single_use_containers: bool = False,
698
698
  ephemeral_disk: Optional[int] = None,
699
699
  include_source: bool = True,
700
700
  experimental_options: Optional[dict[str, str]] = None,
@@ -810,14 +810,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
810
810
  if arg.default is not inspect.Parameter.empty:
811
811
  raise InvalidError(f"Modal batched function {func_name} does not accept default arguments.")
812
812
 
813
- if max_inputs is not None:
814
- if not isinstance(max_inputs, int):
815
- raise InvalidError(f"`max_inputs` must be an int, not {type(max_inputs).__name__}")
816
- if max_inputs <= 0:
817
- raise InvalidError("`max_inputs` must be positive")
818
- if max_inputs > 1:
819
- raise InvalidError("Only `max_inputs=1` is currently supported")
820
-
821
813
  # Validate volumes
822
814
  validated_volumes = validate_volumes(volumes)
823
815
  cloud_bucket_mounts = [(k, v) for k, v in validated_volumes if isinstance(v, _CloudBucketMount)]
@@ -1024,7 +1016,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1024
1016
  object_dependencies=object_dependencies,
1025
1017
  block_network=block_network,
1026
1018
  untrusted=restrict_modal_access,
1027
- max_inputs=max_inputs or 0,
1019
+ single_use_containers=single_use_containers,
1020
+ max_inputs=int(single_use_containers), # TODO(michael) remove after worker rollover
1028
1021
  cloud_bucket_mounts=cloud_bucket_mounts_to_proto(cloud_bucket_mounts),
1029
1022
  scheduler_placement=scheduler_placement,
1030
1023
  is_class=info.is_service_class(),
@@ -845,8 +845,9 @@ class _ContainerIOManager:
845
845
  yield inputs
846
846
  yielded = True
847
847
 
848
- # We only support max_inputs = 1 at the moment
849
- if final_input_received or self.function_def.max_inputs == 1:
848
+ # TODO(michael): Remove use of max_inputs after worker rollover
849
+ single_use_container = self.function_def.single_use_containers or self.function_def.max_inputs == 1
850
+ if final_input_received or single_use_container:
850
851
  return
851
852
  finally:
852
853
  if not yielded:
modal/app.py CHANGED
@@ -725,9 +725,7 @@ class _App:
725
725
  enable_memory_snapshot: bool = False, # Enable memory checkpointing for faster cold starts.
726
726
  block_network: bool = False, # Whether to block network access
727
727
  restrict_modal_access: bool = False, # Whether to allow this function access to other Modal resources
728
- # Maximum number of inputs a container should handle before shutting down.
729
- # With `max_inputs = 1`, containers will be single-use.
730
- max_inputs: Optional[int] = None,
728
+ single_use_containers: bool = False, # When True, containers will shut down after handling a single input
731
729
  i6pn: Optional[bool] = None, # Whether to enable IPv6 container networking within the region.
732
730
  # Whether the file or directory containing the Function's source should automatically be included
733
731
  # in the container. When unset, falls back to the App-level configuration, or is otherwise True by default.
@@ -742,6 +740,7 @@ class _App:
742
740
  concurrency_limit: Optional[int] = None, # Replaced with `max_containers`
743
741
  container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
744
742
  allow_concurrent_inputs: Optional[int] = None, # Replaced with the `@modal.concurrent` decorator
743
+ max_inputs: Optional[int] = None, # Replaced with `single_use_containers`
745
744
  _experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
746
745
  _experimental_scheduler_placement: Optional[SchedulerPlacement] = None, # Replaced in favor of
747
746
  # using `region` and `nonpreemptible`
@@ -764,6 +763,20 @@ class _App:
764
763
  "\n\nSee https://modal.com/docs/guide/modal-1-0-migration for more information.",
765
764
  )
766
765
 
766
+ if max_inputs is not None:
767
+ if not isinstance(max_inputs, int):
768
+ raise InvalidError(f"`max_inputs` must be an int, not {type(max_inputs).__name__}")
769
+ if max_inputs <= 0:
770
+ raise InvalidError("`max_inputs` must be positive")
771
+ if max_inputs > 1:
772
+ raise InvalidError("Only `max_inputs=1` is currently supported")
773
+ deprecation_warning(
774
+ (2025, 12, 16),
775
+ "The `max_inputs` parameter is deprecated. Please set `single_use_containers=True` instead.",
776
+ pending=True,
777
+ )
778
+ single_use_containers = max_inputs == 1
779
+
767
780
  if _experimental_scheduler_placement is not None:
768
781
  deprecation_warning(
769
782
  (2025, 11, 17),
@@ -912,7 +925,7 @@ class _App:
912
925
  enable_memory_snapshot=enable_memory_snapshot,
913
926
  block_network=block_network,
914
927
  restrict_modal_access=restrict_modal_access,
915
- max_inputs=max_inputs,
928
+ single_use_containers=single_use_containers,
916
929
  i6pn_enabled=i6pn_enabled,
917
930
  cluster_size=cluster_size, # Experimental: Clustered functions
918
931
  rdma=rdma,
@@ -969,9 +982,7 @@ class _App:
969
982
  enable_memory_snapshot: bool = False, # Enable memory checkpointing for faster cold starts.
970
983
  block_network: bool = False, # Whether to block network access
971
984
  restrict_modal_access: bool = False, # Whether to allow this class access to other Modal resources
972
- # Limits the number of inputs a container handles before shutting down.
973
- # Use `max_inputs = 1` for single-use containers.
974
- max_inputs: Optional[int] = None,
985
+ single_use_containers: bool = False, # When True, containers will shut down after handling a single input
975
986
  i6pn: Optional[bool] = None, # Whether to enable IPv6 container networking within the region.
976
987
  include_source: Optional[bool] = None, # When `False`, don't automatically add the App source to the container.
977
988
  experimental_options: Optional[dict[str, Any]] = None,
@@ -984,6 +995,7 @@ class _App:
984
995
  concurrency_limit: Optional[int] = None, # Replaced with `max_containers`
985
996
  container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
986
997
  allow_concurrent_inputs: Optional[int] = None, # Replaced with the `@modal.concurrent` decorator
998
+ max_inputs: Optional[int] = None, # Replaced with `single_use_containers`
987
999
  _experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
988
1000
  _experimental_scheduler_placement: Optional[SchedulerPlacement] = None, # Replaced in favor of
989
1001
  # using `region` and `nonpreemptible`
@@ -1002,6 +1014,20 @@ class _App:
1002
1014
  "\n\nSee https://modal.com/docs/guide/modal-1-0-migration for more information.",
1003
1015
  )
1004
1016
 
1017
+ if max_inputs is not None:
1018
+ if not isinstance(max_inputs, int):
1019
+ raise InvalidError(f"`max_inputs` must be an int, not {type(max_inputs).__name__}")
1020
+ if max_inputs <= 0:
1021
+ raise InvalidError("`max_inputs` must be positive")
1022
+ if max_inputs > 1:
1023
+ raise InvalidError("Only `max_inputs=1` is currently supported")
1024
+ deprecation_warning(
1025
+ (2025, 12, 16),
1026
+ "The `max_inputs` parameter is deprecated. Please set `single_use_containers=True` instead.",
1027
+ pending=True,
1028
+ )
1029
+ single_use_containers = max_inputs == 1
1030
+
1005
1031
  if _experimental_scheduler_placement is not None:
1006
1032
  deprecation_warning(
1007
1033
  (2025, 11, 17),
@@ -1139,7 +1165,7 @@ class _App:
1139
1165
  enable_memory_snapshot=enable_memory_snapshot,
1140
1166
  block_network=block_network,
1141
1167
  restrict_modal_access=restrict_modal_access,
1142
- max_inputs=max_inputs,
1168
+ single_use_containers=single_use_containers,
1143
1169
  http_config=http_config,
1144
1170
  i6pn_enabled=i6pn_enabled,
1145
1171
  cluster_size=cluster_size,
modal/app.pyi CHANGED
@@ -491,7 +491,7 @@ class _App:
491
491
  enable_memory_snapshot: bool = False,
492
492
  block_network: bool = False,
493
493
  restrict_modal_access: bool = False,
494
- max_inputs: typing.Optional[int] = None,
494
+ single_use_containers: bool = False,
495
495
  i6pn: typing.Optional[bool] = None,
496
496
  include_source: typing.Optional[bool] = None,
497
497
  experimental_options: typing.Optional[dict[str, typing.Any]] = None,
@@ -502,6 +502,7 @@ class _App:
502
502
  concurrency_limit: typing.Optional[int] = None,
503
503
  container_idle_timeout: typing.Optional[int] = None,
504
504
  allow_concurrent_inputs: typing.Optional[int] = None,
505
+ max_inputs: typing.Optional[int] = None,
505
506
  _experimental_buffer_containers: typing.Optional[int] = None,
506
507
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
507
508
  ) -> _FunctionDecoratorType:
@@ -545,7 +546,7 @@ class _App:
545
546
  enable_memory_snapshot: bool = False,
546
547
  block_network: bool = False,
547
548
  restrict_modal_access: bool = False,
548
- max_inputs: typing.Optional[int] = None,
549
+ single_use_containers: bool = False,
549
550
  i6pn: typing.Optional[bool] = None,
550
551
  include_source: typing.Optional[bool] = None,
551
552
  experimental_options: typing.Optional[dict[str, typing.Any]] = None,
@@ -556,6 +557,7 @@ class _App:
556
557
  concurrency_limit: typing.Optional[int] = None,
557
558
  container_idle_timeout: typing.Optional[int] = None,
558
559
  allow_concurrent_inputs: typing.Optional[int] = None,
560
+ max_inputs: typing.Optional[int] = None,
559
561
  _experimental_buffer_containers: typing.Optional[int] = None,
560
562
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
561
563
  ) -> collections.abc.Callable[[typing.Union[CLS_T, modal._partial_function._PartialFunction]], CLS_T]:
@@ -1154,7 +1156,7 @@ class App:
1154
1156
  enable_memory_snapshot: bool = False,
1155
1157
  block_network: bool = False,
1156
1158
  restrict_modal_access: bool = False,
1157
- max_inputs: typing.Optional[int] = None,
1159
+ single_use_containers: bool = False,
1158
1160
  i6pn: typing.Optional[bool] = None,
1159
1161
  include_source: typing.Optional[bool] = None,
1160
1162
  experimental_options: typing.Optional[dict[str, typing.Any]] = None,
@@ -1165,6 +1167,7 @@ class App:
1165
1167
  concurrency_limit: typing.Optional[int] = None,
1166
1168
  container_idle_timeout: typing.Optional[int] = None,
1167
1169
  allow_concurrent_inputs: typing.Optional[int] = None,
1170
+ max_inputs: typing.Optional[int] = None,
1168
1171
  _experimental_buffer_containers: typing.Optional[int] = None,
1169
1172
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
1170
1173
  ) -> _FunctionDecoratorType:
@@ -1208,7 +1211,7 @@ class App:
1208
1211
  enable_memory_snapshot: bool = False,
1209
1212
  block_network: bool = False,
1210
1213
  restrict_modal_access: bool = False,
1211
- max_inputs: typing.Optional[int] = None,
1214
+ single_use_containers: bool = False,
1212
1215
  i6pn: typing.Optional[bool] = None,
1213
1216
  include_source: typing.Optional[bool] = None,
1214
1217
  experimental_options: typing.Optional[dict[str, typing.Any]] = None,
@@ -1219,6 +1222,7 @@ class App:
1219
1222
  concurrency_limit: typing.Optional[int] = None,
1220
1223
  container_idle_timeout: typing.Optional[int] = None,
1221
1224
  allow_concurrent_inputs: typing.Optional[int] = None,
1225
+ max_inputs: typing.Optional[int] = None,
1222
1226
  _experimental_buffer_containers: typing.Optional[int] = None,
1223
1227
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
1224
1228
  ) -> collections.abc.Callable[[typing.Union[CLS_T, modal.partial_function.PartialFunction]], CLS_T]:
modal/client.pyi CHANGED
@@ -32,7 +32,7 @@ class _Client:
32
32
  server_url: str,
33
33
  client_type: int,
34
34
  credentials: typing.Optional[tuple[str, str]],
35
- version: str = "1.2.7.dev6",
35
+ version: str = "1.2.7.dev7",
36
36
  ):
37
37
  """mdmd:hidden
38
38
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.2.7.dev6",
166
+ version: str = "1.2.7.dev7",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
modal/functions.pyi CHANGED
@@ -106,7 +106,7 @@ class Function(
106
106
  i6pn_enabled: bool = False,
107
107
  cluster_size: typing.Optional[int] = None,
108
108
  rdma: typing.Optional[bool] = None,
109
- max_inputs: typing.Optional[int] = None,
109
+ single_use_containers: bool = False,
110
110
  ephemeral_disk: typing.Optional[int] = None,
111
111
  include_source: bool = True,
112
112
  experimental_options: typing.Optional[dict[str, str]] = None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.7.dev6
3
+ Version: 1.2.7.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ 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=aRuWG1xl3kDy28CfQrqQ-LU8liX2W_bwm2avVOE63Tw,19812
7
- modal/_functions.py,sha256=JAD64JLWua20JtOiDAhJOw9YuP4sgNqY2DyJK9tT21g,91533
7
+ modal/_functions.py,sha256=VqhEE8cctHkonWvtdXOCYnW06TvXPTV1ONeIMoR1SFA,91262
8
8
  modal/_grpc_client.py,sha256=9Yv_aidXWrvcbIYWNpRXUPqEHMvNsYRCSvRrGcVbtPc,6928
9
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
10
10
  modal/_load_context.py,sha256=P7bMvu-_E1YXWhunYU46EqQX78r4D3b05YGz9blSsy8,3786
@@ -21,12 +21,12 @@ modal/_tunnel.py,sha256=bbjVuWiDyC3m_NaVBpgoNQte-NM1FUtDVQsMobQbhc8,6578
21
21
  modal/_tunnel.pyi,sha256=FoedJzHymbPk4Bmnbszm6uhay2rMq1JS9mIiHELYf3k,13804
22
22
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
23
23
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
24
- modal/app.py,sha256=kZ3BiZOTVZ7cjJFsa7Bv1aSpWB3FZo-vFtQYNr3Kuwc,58061
25
- modal/app.pyi,sha256=nI_Tibj-rI5I7dJFJnczbHvcmVzCvvCih0tMzoQlr_Y,50835
24
+ modal/app.py,sha256=xyTCQwLVNBoKENy0aKZIoK7TVegvwXz984VOoKTs-PE,59466
25
+ modal/app.pyi,sha256=rL-UAzRkwoQp-PA96fQAS4YfmjWBDyfasziCMq6NrHI,51015
26
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
27
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
28
  modal/client.py,sha256=k1CqQ_0t4-vHylkqYZgYCnClg-FT0QrTPAKivL01A_k,14354
29
- modal/client.pyi,sha256=vEGk00yRCoY8LzgrWmvJkOW7XUuP0AYSQEVdVg37bWA,13146
29
+ modal/client.pyi,sha256=iDYFbDtM2tc7Sx9WkenkYajql1W5XCmwYk5QETBzolU,13146
30
30
  modal/cloud_bucket_mount.py,sha256=cvVj5Rt4nDHoQbTneoJPTaAcnl_Ab_mrsjnnzd0v9OI,6013
31
31
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
32
  modal/cls.py,sha256=PIGe4ED28jcxC2HeKtMD3odMIb4qNmlRt3tj1dZstRo,41738
@@ -43,7 +43,7 @@ modal/file_io.py,sha256=lfcQAWeuujQol_e1mYlm331Uesh__yWsv-u19gQV7wc,19308
43
43
  modal/file_io.pyi,sha256=MpO5-EA6KuBbOQV0zXV_nPDD5Aw5dfYVa8q9SGBsAVM,14666
44
44
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
45
45
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
46
- modal/functions.pyi,sha256=Gyb8fhedU4BlEXIlgSBdDpQKNL-QIYvRxuf50WrN04k,38111
46
+ modal/functions.pyi,sha256=CeSVZcrjsjh8Gqo5PK7QkbpfSlrKvnFzm3HLYqGEePw,38107
47
47
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
48
48
  modal/image.py,sha256=Pm26DwuD7RqfrxscAHxhoA9LGJYTt_k0wcsHRqbwnzE,107945
49
49
  modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
@@ -86,7 +86,7 @@ modal/volume.py,sha256=ZHVR31U7vzz1hV7EP6v7JQWGr7890FiST71mZh272fg,52310
86
86
  modal/volume.pyi,sha256=sBnG6t4aPjH09vlo63S-k4915uz5VNycE-JPgUjwDs8,53335
87
87
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
88
88
  modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
89
- modal/_runtime/container_io_manager.py,sha256=pmPQJ66Nb8Sa-8CbAMXdjxyBPhDmZMOs-dpFlFpuoas,51978
89
+ modal/_runtime/container_io_manager.py,sha256=EQF1aAtzb0A2chhr0B8es_G0rawbBUKZaFu0-p6dsQU,52102
90
90
  modal/_runtime/container_io_manager.pyi,sha256=GDNLirCcPMRc6gckInYKmGmJZY3LNcgUVXKftt9P9jI,23493
91
91
  modal/_runtime/execution_context.py,sha256=AYrNQRHHXEqX2MwMf8zxelKZnYf25RE_B-NRLWf93n8,3521
92
92
  modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdgWuU4W9k,2426
@@ -158,7 +158,7 @@ modal/experimental/__init__.py,sha256=GOuo3t4-Le0ZVddiHIOw0MQxkdTJge-bVbhDvgnblm
158
158
  modal/experimental/flash.py,sha256=GJZwSr-4OHlP6gCIZdcbsSb8D8WX9xJwMphjwcfsRoU,31262
159
159
  modal/experimental/flash.pyi,sha256=q4a3mdgL0jzATPL2tS7LpuyulYzF1vUSE453S9xc8n8,16965
160
160
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
161
- modal-1.2.7.dev6.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
+ modal-1.2.7.dev7.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
162
162
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
163
163
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
164
164
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -166,10 +166,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
166
166
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
167
167
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
168
168
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
169
- modal_proto/api.proto,sha256=uifRIgOdyqVSgNrfhjtaP6slO7pz25sqeHNnL-1rpPY,110881
169
+ modal_proto/api.proto,sha256=bs2s1cWI6iciKdq-eFfki4vtYS3Q2XBrbxbbtLJuRCE,111143
170
170
  modal_proto/api_grpc.py,sha256=-8SHvPtalTAjQtRv7zzU7Z1VoDupoJs2ifG4gl_mF0s,134442
171
- modal_proto/api_pb2.py,sha256=Ct-kyJ6clznmAC2IzyZzxxnJc2pYeRjazlpOfSzs8Bk,384491
172
- modal_proto/api_pb2.pyi,sha256=4m3krGtBOGioOViGUtQJnMw3eCxe-j3VdWr2AWHhx6M,542488
171
+ modal_proto/api_pb2.py,sha256=WtQuOdWlkcFgehpcn27nZmdQ5uMQPvluzElkHfdQlhM,384541
172
+ modal_proto/api_pb2.pyi,sha256=3MsY1f4n7LfMiy-J5zA-cKHPci3ejSMb3JaISxkbHAU,542926
173
173
  modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,289714
174
174
  modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
175
175
  modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
@@ -180,10 +180,10 @@ modal_proto/task_command_router_pb2.py,sha256=2Y8wRvnq4_7RiQ-5ZAPIgXaxrHv_MXzgS5
180
180
  modal_proto/task_command_router_pb2.pyi,sha256=yI4tFteErLlonFA2HyaWtONfhY_VGSe7KCWFIspvmkE,16323
181
181
  modal_proto/task_command_router_pb2_grpc.py,sha256=q2VWfK2-4uDcPaPLhAqPZkgxhuQRYnWmwUcnEbPbGuk,13895
182
182
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=e1MM10VGUgDkm041v53QeTglGQPzTpA0FUsFtezjp74,4536
183
- modal_version/__init__.py,sha256=FwTeazkANh8hfTrQNSwBYfVxE4ftKxDfOyO3YKhXrKY,120
183
+ modal_version/__init__.py,sha256=EIU8WY6zGrQ5WjfZUZ42Hl3spbaZh3QHRY0P_2zdMb8,120
184
184
  modal_version/__main__.py,sha256=nLUbubxKx7GXNzJIkTB7M7_u8080LyLM0IS0rzFkC_c,119
185
- modal-1.2.7.dev6.dist-info/METADATA,sha256=h9P8cAsr3n2u-XCUg6dfncACZHNMObnhk1Vx45TYvx8,2491
186
- modal-1.2.7.dev6.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
187
- modal-1.2.7.dev6.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
188
- modal-1.2.7.dev6.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
189
- modal-1.2.7.dev6.dist-info/RECORD,,
185
+ modal-1.2.7.dev7.dist-info/METADATA,sha256=FpCHbZMv2nPWKfnWIBQ7nXtlMtihMgF0eImXNNBNFK8,2491
186
+ modal-1.2.7.dev7.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
187
+ modal-1.2.7.dev7.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
188
+ modal-1.2.7.dev7.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
189
+ modal-1.2.7.dev7.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1469,6 +1469,8 @@ message Function {
1469
1469
 
1470
1470
  bool block_network = 44;
1471
1471
 
1472
+ // In the SDK, we've deprecated `max_inputs` (which only every implemented `max_inputs=1`)
1473
+ // in favor of a boolean `single_use_containers` parameter.
1472
1474
  uint32 max_inputs = 46;
1473
1475
 
1474
1476
  repeated S3Mount s3_mounts = 47;
@@ -1556,6 +1558,9 @@ message Function {
1556
1558
  // Attribute on the module with the implementation, which may differ from function_name
1557
1559
  // when the user provided a custom name= for the Function inside the Application namespace
1558
1560
  string implementation_name = 90;
1561
+
1562
+ bool single_use_containers = 91; // When True, containers will shut down after handling a single input
1563
+
1559
1564
  }
1560
1565
 
1561
1566
  message FunctionAsyncInvokeRequest {