modal 0.74.45__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 +62 -10
- modal/client.pyi +2 -2
- modal/cls.py +56 -8
- modal/cls.pyi +28 -0
- modal/experimental/__init__.py +8 -0
- modal/functions.pyi +26 -6
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/METADATA +1 -1
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/RECORD +13 -13
- modal_version/_version_generated.py +1 -1
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/WHEEL +0 -0
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/entry_points.txt +0 -0
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/licenses/LICENSE +0 -0
- {modal-0.74.45.dist-info → modal-0.74.46.dist-info}/top_level.txt +0 -0
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
|
1103
|
+
"""Set the warm pool size for the Function.
|
1055
1104
|
|
1056
|
-
Please
|
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
|
-
#
|
1065
|
-
|
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
|
-
|
1081
|
-
|
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
|
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.
|
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.
|
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
|
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(
|
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
|
-
|
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: ...
|
modal/experimental/__init__.py
CHANGED
@@ -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: ...
|
@@ -198,11 +218,11 @@ class Function(
|
|
198
218
|
|
199
219
|
_call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
|
200
220
|
|
201
|
-
class __remote_spec(typing_extensions.Protocol[
|
221
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
202
222
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
203
223
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
204
224
|
|
205
|
-
remote: __remote_spec[modal._functions.
|
225
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
206
226
|
|
207
227
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
208
228
|
def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -217,19 +237,19 @@ class Function(
|
|
217
237
|
self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
|
218
238
|
) -> modal._functions.OriginalReturnType: ...
|
219
239
|
|
220
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
240
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
221
241
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
222
242
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
223
243
|
|
224
244
|
_experimental_spawn: ___experimental_spawn_spec[
|
225
|
-
modal._functions.
|
245
|
+
modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
|
226
246
|
]
|
227
247
|
|
228
|
-
class __spawn_spec(typing_extensions.Protocol[
|
248
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
229
249
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
230
250
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
231
251
|
|
232
|
-
spawn: __spawn_spec[modal._functions.
|
252
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
233
253
|
|
234
254
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
|
235
255
|
|
@@ -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=
|
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=
|
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=
|
29
|
-
modal/cls.pyi,sha256=
|
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=
|
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
|
@@ -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=
|
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.
|
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=
|
174
|
-
modal-0.74.
|
175
|
-
modal-0.74.
|
176
|
-
modal-0.74.
|
177
|
-
modal-0.74.
|
178
|
-
modal-0.74.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|