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 +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 +20 -0
- modal/secret.py +3 -3
- modal/secret.pyi +6 -6
- {modal-0.74.44.dist-info → modal-0.74.46.dist-info}/METADATA +1 -1
- {modal-0.74.44.dist-info → modal-0.74.46.dist-info}/RECORD +15 -15
- modal_version/_version_generated.py +1 -1
- {modal-0.74.44.dist-info → modal-0.74.46.dist-info}/WHEEL +0 -0
- {modal-0.74.44.dist-info → modal-0.74.46.dist-info}/entry_points.txt +0 -0
- {modal-0.74.44.dist-info → modal-0.74.46.dist-info}/licenses/LICENSE +0 -0
- {modal-0.74.44.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: ...
|
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] = []
|
@@ -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
|
@@ -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=
|
73
|
-
modal/secret.pyi,sha256=
|
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=
|
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
|