modal 0.74.44__py3-none-any.whl → 0.74.46__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
@@ -1049,21 +1049,69 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1049
1049
  fun._spec = self._spec # TODO (elias): fix - this is incorrect when using with_options
1050
1050
  return fun
1051
1051
 
1052
+ @live_method
1053
+ async def update_autoscaler(
1054
+ self,
1055
+ *,
1056
+ min_containers: Optional[int] = None,
1057
+ max_containers: Optional[int] = None,
1058
+ buffer_containers: Optional[int] = None,
1059
+ scaledown_window: Optional[int] = None,
1060
+ ) -> None:
1061
+ """Override the current autoscaler behavior for this Function.
1062
+
1063
+ Unspecified parameters will retain their current value, i.e. either the static value
1064
+ from the function decorator, or an override value from a previous call to this method.
1065
+
1066
+ Subsequent deployments of the App containing this Function will reset the autoscaler back to
1067
+ its static configuration.
1068
+
1069
+ Examples:
1070
+
1071
+ ```python notest
1072
+ f = modal.Function.from_name("my-app", "function")
1073
+
1074
+ # Always have at least 2 containers running, with an extra buffer when the Function is active
1075
+ f.update_autoscaler(min_containers=2, buffer_containers=1)
1076
+
1077
+ # Limit this Function to avoid spinning up more than 5 containers
1078
+ f.update_autoscaler(max_containers=5)
1079
+
1080
+ # Extend the scaledown window to increase the amount of time that idle containers stay alive
1081
+ f.update_autoscaler(scaledown_window=300)
1082
+
1083
+ ```
1084
+
1085
+ """
1086
+ if self._is_method:
1087
+ raise InvalidError("Cannot call .update_autoscaler() on a method. Call it on the class instance instead.")
1088
+
1089
+ settings = api_pb2.AutoscalerSettings(
1090
+ min_containers=min_containers,
1091
+ max_containers=max_containers,
1092
+ buffer_containers=buffer_containers,
1093
+ scaledown_window=scaledown_window,
1094
+ )
1095
+ request = api_pb2.FunctionUpdateSchedulingParamsRequest(function_id=self.object_id, settings=settings)
1096
+ await retry_transient_errors(self.client.stub.FunctionUpdateSchedulingParams, request)
1097
+
1098
+ # One idea would be for FunctionUpdateScheduleParams to return the current (coalesced) settings
1099
+ # and then we could return them here (would need some ad hoc dataclass, which I don't love)
1100
+
1052
1101
  @live_method
1053
1102
  async def keep_warm(self, warm_pool_size: int) -> None:
1054
- """Set the warm pool size for the function.
1103
+ """Set the warm pool size for the Function.
1055
1104
 
1056
- Please exercise care when using this advanced feature!
1057
- Setting and forgetting a warm pool on functions can lead to increased costs.
1105
+ DEPRECATED: Please adapt your code to use the more general `update_autoscaler` method instead:
1058
1106
 
1059
1107
  ```python notest
1060
- # Usage on a regular function.
1061
1108
  f = modal.Function.from_name("my-app", "function")
1109
+
1110
+ # Old pattern (deprecated)
1062
1111
  f.keep_warm(2)
1063
1112
 
1064
- # Usage on a parametrized function.
1065
- Model = modal.Cls.from_name("my-app", "Model")
1066
- Model("fine-tuned-model").keep_warm(2) # note that this applies to the class instance, not a method
1113
+ # New pattern
1114
+ f.update_autoscaler(min_containers=2)
1067
1115
  ```
1068
1116
  """
1069
1117
  if self._is_method:
@@ -1077,10 +1125,14 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1077
1125
  """
1078
1126
  )
1079
1127
  )
1080
- request = api_pb2.FunctionUpdateSchedulingParamsRequest(
1081
- function_id=self.object_id, warm_pool_size_override=warm_pool_size
1128
+
1129
+ deprecation_warning(
1130
+ (2025, 5, 5),
1131
+ "The .keep_warm() method has been deprecated in favor of the more general "
1132
+ ".update_autoscaler(min_containers=...) method.",
1133
+ show_source=True,
1082
1134
  )
1083
- await retry_transient_errors(self.client.stub.FunctionUpdateSchedulingParams, request)
1135
+ await self.update_autoscaler(min_containers=warm_pool_size)
1084
1136
 
1085
1137
  @classmethod
1086
1138
  def _from_name(cls, app_name: str, name: str, namespace, environment_name: Optional[str]):
modal/client.pyi CHANGED
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.44"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.46"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.44"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.46"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/cls.py CHANGED
@@ -231,22 +231,70 @@ class _Obj:
231
231
  user_cls_instance._modal_functions = instance_methods
232
232
  return user_cls_instance
233
233
 
234
+ async def update_autoscaler(
235
+ self,
236
+ *,
237
+ min_containers: Optional[int] = None,
238
+ max_containers: Optional[int] = None,
239
+ scaledown_window: Optional[int] = None,
240
+ buffer_containers: Optional[int] = None,
241
+ ) -> None:
242
+ """Override the current autoscaler behavior for this Cls instance.
243
+
244
+ Unspecified parameters will retain their current value, i.e. either the static value
245
+ from the function decorator, or an override value from a previous call to this method.
246
+
247
+ Subsequent deployments of the App containing this Cls will reset the autoscaler back to
248
+ its static configuration.
249
+
250
+ Note: When calling this method on a Cls that is defined locally, static type checkers will
251
+ issue an error, because the object will appear to have the user-defined type.
252
+
253
+ Examples:
254
+
255
+ ```python notest
256
+ Model = modal.Cls.from_name("my-app", "Model")
257
+ model = Model() # This method is called on an *instance* of the class
258
+
259
+ # Always have at least 2 containers running, with an extra buffer when the Function is active
260
+ model.update_autoscaler(min_containers=2, buffer_containers=1)
261
+
262
+ # Limit this Function to avoid spinning up more than 5 containers
263
+ f.update_autoscaler(max_containers=5)
264
+ ```
265
+
266
+ """
267
+ return await self._cached_service_function().update_autoscaler(
268
+ min_containers=min_containers,
269
+ max_containers=max_containers,
270
+ scaledown_window=scaledown_window,
271
+ buffer_containers=buffer_containers,
272
+ )
273
+
234
274
  async def keep_warm(self, warm_pool_size: int) -> None:
235
275
  """Set the warm pool size for the class containers
236
276
 
237
- Please exercise care when using this advanced feature!
238
- Setting and forgetting a warm pool on functions can lead to increased costs.
239
-
240
- Note that all Modal methods and web endpoints of a class share the same set
241
- of containers and the warm_pool_size affects that common container pool.
277
+ DEPRECATED: Please adapt your code to use the more general `update_autoscaler` method instead:
242
278
 
243
279
  ```python notest
244
- # Usage on a parametrized function.
245
280
  Model = modal.Cls.from_name("my-app", "Model")
246
- Model("fine-tuned-model").keep_warm(2)
281
+ model = Model() # This method is called on an *instance* of the class
282
+
283
+ # Old pattern (deprecated)
284
+ model.keep_warm(2)
285
+
286
+ # New pattern
287
+ model.update_autoscaler(min_containers=2)
247
288
  ```
289
+
248
290
  """
249
- await self._cached_service_function().keep_warm(warm_pool_size)
291
+ deprecation_warning(
292
+ (2025, 5, 5),
293
+ "The .keep_warm() method has been deprecated in favor of the more general "
294
+ ".update_autoscaler(min_containers=...) method.",
295
+ show_source=True,
296
+ )
297
+ await self._cached_service_function().update_autoscaler(min_containers=warm_pool_size)
250
298
 
251
299
  def _cached_user_cls_instance(self):
252
300
  """Get or construct the local object
modal/cls.pyi CHANGED
@@ -65,6 +65,14 @@ class _Obj:
65
65
  def _cached_service_function(self) -> modal._functions._Function: ...
66
66
  def _get_parameter_values(self) -> dict[str, typing.Any]: ...
67
67
  def _new_user_cls_instance(self): ...
68
+ async def update_autoscaler(
69
+ self,
70
+ *,
71
+ min_containers: typing.Optional[int] = None,
72
+ max_containers: typing.Optional[int] = None,
73
+ scaledown_window: typing.Optional[int] = None,
74
+ buffer_containers: typing.Optional[int] = None,
75
+ ) -> None: ...
68
76
  async def keep_warm(self, warm_pool_size: int) -> None: ...
69
77
  def _cached_user_cls_instance(self): ...
70
78
  def _enter(self): ...
@@ -94,6 +102,26 @@ class Obj:
94
102
  def _get_parameter_values(self) -> dict[str, typing.Any]: ...
95
103
  def _new_user_cls_instance(self): ...
96
104
 
105
+ class __update_autoscaler_spec(typing_extensions.Protocol[SUPERSELF]):
106
+ def __call__(
107
+ self,
108
+ *,
109
+ min_containers: typing.Optional[int] = None,
110
+ max_containers: typing.Optional[int] = None,
111
+ scaledown_window: typing.Optional[int] = None,
112
+ buffer_containers: typing.Optional[int] = None,
113
+ ) -> None: ...
114
+ async def aio(
115
+ self,
116
+ *,
117
+ min_containers: typing.Optional[int] = None,
118
+ max_containers: typing.Optional[int] = None,
119
+ scaledown_window: typing.Optional[int] = None,
120
+ buffer_containers: typing.Optional[int] = None,
121
+ ) -> None: ...
122
+
123
+ update_autoscaler: __update_autoscaler_spec[typing_extensions.Self]
124
+
97
125
  class __keep_warm_spec(typing_extensions.Protocol[SUPERSELF]):
98
126
  def __call__(self, warm_pool_size: int) -> None: ...
99
127
  async def aio(self, warm_pool_size: int) -> None: ...
@@ -12,6 +12,7 @@ from .._object import _get_environment_name
12
12
  from .._partial_function import _clustered
13
13
  from .._runtime.container_io_manager import _ContainerIOManager
14
14
  from .._utils.async_utils import synchronize_api, synchronizer
15
+ from .._utils.deprecation import deprecation_warning
15
16
  from .._utils.grpc_utils import retry_transient_errors
16
17
  from ..client import _Client
17
18
  from ..cls import _Obj
@@ -179,6 +180,13 @@ async def update_autoscaler(
179
180
  may look different (i.e., it may be a standalone function or a method).
180
181
 
181
182
  """
183
+ deprecation_warning(
184
+ (2025, 5, 5),
185
+ "The modal.experimental.update_autoscaler(...) function is now deprecated in favor of"
186
+ " a stable `.update_autoscaler(...) method on the corresponding object.",
187
+ show_source=True,
188
+ )
189
+
182
190
  settings = api_pb2.AutoscalerSettings(
183
191
  min_containers=min_containers,
184
192
  max_containers=max_containers,
modal/functions.pyi CHANGED
@@ -110,6 +110,26 @@ class Function(
110
110
  kwargs: dict[str, typing.Any],
111
111
  ) -> Function: ...
112
112
 
113
+ class __update_autoscaler_spec(typing_extensions.Protocol[SUPERSELF]):
114
+ def __call__(
115
+ self,
116
+ *,
117
+ min_containers: typing.Optional[int] = None,
118
+ max_containers: typing.Optional[int] = None,
119
+ buffer_containers: typing.Optional[int] = None,
120
+ scaledown_window: typing.Optional[int] = None,
121
+ ) -> None: ...
122
+ async def aio(
123
+ self,
124
+ *,
125
+ min_containers: typing.Optional[int] = None,
126
+ max_containers: typing.Optional[int] = None,
127
+ buffer_containers: typing.Optional[int] = None,
128
+ scaledown_window: typing.Optional[int] = None,
129
+ ) -> None: ...
130
+
131
+ update_autoscaler: __update_autoscaler_spec[typing_extensions.Self]
132
+
113
133
  class __keep_warm_spec(typing_extensions.Protocol[SUPERSELF]):
114
134
  def __call__(self, warm_pool_size: int) -> None: ...
115
135
  async def aio(self, warm_pool_size: int) -> None: ...
modal/secret.py CHANGED
@@ -34,7 +34,7 @@ class _Secret(_Object, type_prefix="st"):
34
34
  env_dict: dict[
35
35
  str, Union[str, None]
36
36
  ] = {}, # dict of entries to be inserted as environment variables in functions using the secret
37
- ):
37
+ ) -> "_Secret":
38
38
  """Create a secret from a str-str dictionary. Values can also be `None`, which is ignored.
39
39
 
40
40
  Usage:
@@ -81,7 +81,7 @@ class _Secret(_Object, type_prefix="st"):
81
81
  @staticmethod
82
82
  def from_local_environ(
83
83
  env_keys: list[str], # list of local env vars to be included for remote execution
84
- ):
84
+ ) -> "_Secret":
85
85
  """Create secrets from local environment variables automatically."""
86
86
 
87
87
  if is_local():
@@ -96,7 +96,7 @@ class _Secret(_Object, type_prefix="st"):
96
96
  return _Secret.from_dict({})
97
97
 
98
98
  @staticmethod
99
- def from_dotenv(path=None, *, filename=".env"):
99
+ def from_dotenv(path=None, *, filename=".env") -> "_Secret":
100
100
  """Create secrets from a .env file automatically.
101
101
 
102
102
  If no argument is provided, it will use the current working directory as the starting
modal/secret.pyi CHANGED
@@ -6,11 +6,11 @@ import typing_extensions
6
6
 
7
7
  class _Secret(modal._object._Object):
8
8
  @staticmethod
9
- def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
9
+ def from_dict(env_dict: dict[str, typing.Optional[str]] = {}) -> _Secret: ...
10
10
  @staticmethod
11
- def from_local_environ(env_keys: list[str]): ...
11
+ def from_local_environ(env_keys: list[str]) -> _Secret: ...
12
12
  @staticmethod
13
- def from_dotenv(path=None, *, filename=".env"): ...
13
+ def from_dotenv(path=None, *, filename=".env") -> _Secret: ...
14
14
  @staticmethod
15
15
  def from_name(
16
16
  name: str, *, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
@@ -36,11 +36,11 @@ class _Secret(modal._object._Object):
36
36
  class Secret(modal.object.Object):
37
37
  def __init__(self, *args, **kwargs): ...
38
38
  @staticmethod
39
- def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
39
+ def from_dict(env_dict: dict[str, typing.Optional[str]] = {}) -> Secret: ...
40
40
  @staticmethod
41
- def from_local_environ(env_keys: list[str]): ...
41
+ def from_local_environ(env_keys: list[str]) -> Secret: ...
42
42
  @staticmethod
43
- def from_dotenv(path=None, *, filename=".env"): ...
43
+ def from_dotenv(path=None, *, filename=".env") -> Secret: ...
44
44
  @staticmethod
45
45
  def from_name(
46
46
  name: str, *, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.44
3
+ Version: 0.74.46
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=sTJcc9EbDuCKSwg3tL6ZckFw9WWdlkXW8mId1IvJCNc,2846
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
5
  modal/_container_entrypoint.py,sha256=2Zx9O_EMJg0H77EdnC2vGKs6uFMWwbP1NLFf-qYmWmU,28962
6
- modal/_functions.py,sha256=R6L5cWIy2Lls6O6_taAIalUCigXwm1VU5Kb98Qffxr0,74233
6
+ modal/_functions.py,sha256=HJwXHoIOP950GUhTeu1g3PUK70ioIf4-ZbUG5DxuQZg,76157
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
9
  modal/_object.py,sha256=6ve4sI2nRAnjPCuAXdSoUplaXfzC9MqRlF_ZLULwwy0,11472
@@ -22,11 +22,11 @@ modal/app.py,sha256=r-9vVU1lrR1CWtJEo60fuaianvxY_oOXZyv1Qx1DEkI,51231
22
22
  modal/app.pyi,sha256=0QNtnUpAFbOPcbwCt119ge7OmoBqMFw5SajLgdE5eOw,28600
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
25
- modal/client.pyi,sha256=cwIyiWSCJzcoX33hLR2JME97LUoPaLRaNaLHvljlR1M,7593
25
+ modal/client.pyi,sha256=xoxJFXQr3LfDeNH_qwmoyiBj9yEwInbXrBPFyg_lo2U,7593
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
- modal/cls.py,sha256=pfEKqzNldQbtoM45CApRhSd8jJ7hD6o-83SLX8DTXXk,33549
29
- modal/cls.pyi,sha256=IbSOur4-TlTSxv5fNxaMb9t7W2wmN_rpQZAS7UXMSbo,10946
28
+ modal/cls.py,sha256=aHoMEWMZUN7bOezs3tRPxzS1FP3gTxZBORVjbPmtxyg,35338
29
+ modal/cls.pyi,sha256=B--Y4xEOo3GRE3QiiFdIE8jnIKEeBcOtwAbXvg2Z8H4,12012
30
30
  modal/config.py,sha256=nKlX60bC1O-qAEsbGq-efRX1q25h13RyVnoM_0bnhSw,12229
31
31
  modal/container_process.py,sha256=vvyK3DVPUMsuqvkKdUiQ49cDLF9JawGrxpglLk5vfgI,6208
32
32
  modal/container_process.pyi,sha256=bXs2KHe7nxVuLAm6RRBqXCvDKelANGX9gFY8qIuZYDs,2898
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
39
39
  modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
40
40
  modal/file_pattern_matcher.py,sha256=trosX-Bp7dOubudN1bLLhRAoidWy1TcoaR4Pv8CedWw,6497
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=crMI93dnZoO4-ardLGOYgIay5KSMb5S0Oyc0e9Pr3GI,14870
42
+ modal/functions.pyi,sha256=ol1tE9OAmXn9f3UwXg-q2LuYN3t_mxjsz1k-QCCo-_A,15642
43
43
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
44
44
  modal/image.py,sha256=ZCghS6l1O7pezXcdMHk6RoJpW3qWszfWGJTW38lNXaU,92797
45
45
  modal/image.pyi,sha256=ddbegF532pDLiVANOJdtJiYoDbbF3mAFrsCiyvIu7jU,25632
@@ -69,8 +69,8 @@ modal/sandbox.py,sha256=aLW1hCMrk9ndfXaWjDcknS0U-ei-GhUpSjo-pURrnW8,32722
69
69
  modal/sandbox.pyi,sha256=cLmSwI1ab-2DgEuXNf6S1PiK63wfUR9dHtxlZtSOuX8,22719
70
70
  modal/schedule.py,sha256=ewa7hb9NKYnoeSCW2PujZAbGGJL8btX6X3KalCFpc_M,2626
71
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
72
- modal/secret.py,sha256=VEM3Kh-yLZZIMCfBXyfrZwAOQLwMkleXhYp2FxF0bsA,10466
73
- modal/secret.pyi,sha256=5SrdJANekeHa2qrd-0iRYADWl5-6MUIlsQnxlx5MopM,2980
72
+ modal/secret.py,sha256=oczsOxMDifDusYA6_w49bGTDujHbxefyWNGspq62LRE,10505
73
+ modal/secret.pyi,sha256=b1jcMx9Z4bSIGOcrbyRPc68lzkFQBEauUP71gbnZeL4,3043
74
74
  modal/serving.py,sha256=orZjhyikqk7U77My7GedbVKy65j0_CF7J7mqye86dRw,4650
75
75
  modal/serving.pyi,sha256=KGSaZhg0qwygLmDkhgJedUfWeNSkXsyoOipq10vYffU,1978
76
76
  modal/snapshot.py,sha256=6rQvDP3iX9hdiAudKTy0-m0JESt4kk0q2gusXbaRA-8,1279
@@ -136,7 +136,7 @@ modal/cli/volume.py,sha256=_PJ5Vn_prkLk_x1Lksx4kZySlKWqIn36T2Edd1-h7Mg,10497
136
136
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
137
137
  modal/cli/programs/run_jupyter.py,sha256=YVvJYu927A4ji72d6i27CKfyZ_uDWteeittARtJnf7E,2775
138
138
  modal/cli/programs/vscode.py,sha256=kfvhZQ4bJwtVm3MgC1V7AlygZOlKT1a33alr_uwrewA,3473
139
- modal/experimental/__init__.py,sha256=GCE8vAcVj2nQB0-v2j49mQBsHpAQkbmCTths9lJffNw,7962
139
+ modal/experimental/__init__.py,sha256=GYWLyYHpO0xWxo1s-uP5ZuD8IBFKbhCUAke3kq3jv_4,8272
140
140
  modal/experimental/ipython.py,sha256=epLUZeDSdE226TH_tU3igRKCiVuQi99mUOrIJ4SemOE,2792
141
141
  modal/requirements/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u1eTYw,400
142
142
  modal/requirements/2023.12.txt,sha256=OjsbXFkCSdkzzryZP82Q73osr5wxQ6EUzmGcK7twfkA,502
@@ -145,7 +145,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
145
145
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
146
146
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
147
147
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
148
- modal-0.74.44.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
148
+ modal-0.74.46.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
149
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
150
150
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
151
151
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -170,9 +170,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
170
170
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  modal_version/__init__.py,sha256=m94xZNWIjH8oUtJk4l9xfovzDJede2o7X-q0MHVECtM,470
172
172
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
173
- modal_version/_version_generated.py,sha256=A2au9WWp8OSJGELFBGHBaU8Q48nDv5wD_3RhTsz8opQ,149
174
- modal-0.74.44.dist-info/METADATA,sha256=07r7G26kX3keUDnSBhVjtaCEBrktd04tpkxSiC3A7Z0,2451
175
- modal-0.74.44.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
- modal-0.74.44.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
- modal-0.74.44.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
- modal-0.74.44.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=ahManic3B4nupyKNcn-TX9U7keHLYQXmmJ5vAgdYzsw,149
174
+ modal-0.74.46.dist-info/METADATA,sha256=ohmGTsTX5RhtYaGDnxse-AQe32XQuRvvyo-v_umyadU,2451
175
+ modal-0.74.46.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
+ modal-0.74.46.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
+ modal-0.74.46.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
+ modal-0.74.46.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 44 # git: 58b258f
4
+ build_number = 46 # git: c9b08ba