modal 0.67.22__py3-none-any.whl → 0.67.27__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/_utils/function_utils.py +6 -0
- modal/client.pyi +2 -2
- modal/cls.py +67 -14
- modal/cls.pyi +5 -6
- modal/functions.py +1 -64
- modal/functions.pyi +6 -10
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/METADATA +1 -1
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/RECORD +13 -13
- modal_version/_version_generated.py +1 -1
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/LICENSE +0 -0
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/WHEEL +0 -0
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/entry_points.txt +0 -0
- {modal-0.67.22.dist-info → modal-0.67.27.dist-info}/top_level.txt +0 -0
modal/_utils/function_utils.py
CHANGED
@@ -248,7 +248,13 @@ class FunctionInfo:
|
|
248
248
|
def get_globals(self) -> dict[str, Any]:
|
249
249
|
from .._vendor.cloudpickle import _extract_code_globals
|
250
250
|
|
251
|
+
if self.raw_f is None:
|
252
|
+
return {}
|
253
|
+
|
251
254
|
func = self.raw_f
|
255
|
+
while hasattr(func, "__wrapped__") and func is not func.__wrapped__:
|
256
|
+
# Unwrap functions decorated using functools.wrapped (potentially multiple times)
|
257
|
+
func = func.__wrapped__
|
252
258
|
f_globals_ref = _extract_code_globals(func.__code__)
|
253
259
|
f_globals = {k: func.__globals__[k] for k in f_globals_ref if k in func.__globals__}
|
254
260
|
return f_globals
|
modal/client.pyi
CHANGED
@@ -26,7 +26,7 @@ class _Client:
|
|
26
26
|
_stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
|
27
27
|
|
28
28
|
def __init__(
|
29
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.
|
29
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.27"
|
30
30
|
): ...
|
31
31
|
def is_closed(self) -> bool: ...
|
32
32
|
@property
|
@@ -81,7 +81,7 @@ class Client:
|
|
81
81
|
_stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
|
82
82
|
|
83
83
|
def __init__(
|
84
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.
|
84
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.27"
|
85
85
|
): ...
|
86
86
|
def is_closed(self) -> bool: ...
|
87
87
|
@property
|
modal/cls.py
CHANGED
@@ -72,6 +72,68 @@ def _get_class_constructor_signature(user_cls: type) -> inspect.Signature:
|
|
72
72
|
return inspect.Signature(constructor_parameters)
|
73
73
|
|
74
74
|
|
75
|
+
def _bind_instance_method(service_function: _Function, class_bound_method: _Function):
|
76
|
+
"""mdmd:hidden
|
77
|
+
|
78
|
+
Binds an "instance service function" to a specific method.
|
79
|
+
This "dummy" _Function gets no unique object_id and isn't backend-backed at the moment, since all
|
80
|
+
it does it forward invocations to the underlying instance_service_function with the specified method,
|
81
|
+
and we don't support web_config for parameterized methods at the moment.
|
82
|
+
"""
|
83
|
+
# TODO(elias): refactor to not use `_from_loader()` as a crutch for lazy-loading the
|
84
|
+
# underlying instance_service_function. It's currently used in order to take advantage
|
85
|
+
# of resolver logic and get "chained" resolution of lazy loads, even though this thin
|
86
|
+
# object itself doesn't need any "loading"
|
87
|
+
assert service_function._obj
|
88
|
+
method_name = class_bound_method._use_method_name
|
89
|
+
full_function_name = f"{class_bound_method._function_name}[parameterized]"
|
90
|
+
|
91
|
+
def hydrate_from_instance_service_function(method_placeholder_fun):
|
92
|
+
method_placeholder_fun._hydrate_from_other(service_function)
|
93
|
+
method_placeholder_fun._obj = service_function._obj
|
94
|
+
method_placeholder_fun._web_url = (
|
95
|
+
class_bound_method._web_url
|
96
|
+
) # TODO: this shouldn't be set when actual parameters are used
|
97
|
+
method_placeholder_fun._function_name = full_function_name
|
98
|
+
method_placeholder_fun._is_generator = class_bound_method._is_generator
|
99
|
+
method_placeholder_fun._cluster_size = class_bound_method._cluster_size
|
100
|
+
method_placeholder_fun._use_method_name = method_name
|
101
|
+
method_placeholder_fun._is_method = True
|
102
|
+
|
103
|
+
async def _load(fun: "_Function", resolver: Resolver, existing_object_id: Optional[str]):
|
104
|
+
# there is currently no actual loading logic executed to create each method on
|
105
|
+
# the *parameterized* instance of a class - it uses the parameter-bound service-function
|
106
|
+
# for the instance. This load method just makes sure to set all attributes after the
|
107
|
+
# `service_function` has been loaded (it's in the `_deps`)
|
108
|
+
hydrate_from_instance_service_function(fun)
|
109
|
+
|
110
|
+
def _deps():
|
111
|
+
if service_function.is_hydrated:
|
112
|
+
# without this check, the common service_function will be reloaded by all methods
|
113
|
+
# TODO(elias): Investigate if we can fix this multi-loader in the resolver - feels like a bug?
|
114
|
+
return []
|
115
|
+
return [service_function]
|
116
|
+
|
117
|
+
rep = f"Method({full_function_name})"
|
118
|
+
|
119
|
+
fun = _Function._from_loader(
|
120
|
+
_load,
|
121
|
+
rep,
|
122
|
+
deps=_deps,
|
123
|
+
hydrate_lazily=True,
|
124
|
+
)
|
125
|
+
if service_function.is_hydrated:
|
126
|
+
# Eager hydration (skip load) if the instance service function is already loaded
|
127
|
+
hydrate_from_instance_service_function(fun)
|
128
|
+
|
129
|
+
fun._info = class_bound_method._info
|
130
|
+
fun._obj = service_function._obj
|
131
|
+
fun._is_method = True
|
132
|
+
fun._app = class_bound_method._app
|
133
|
+
fun._spec = class_bound_method._spec
|
134
|
+
return fun
|
135
|
+
|
136
|
+
|
75
137
|
class _Obj:
|
76
138
|
"""An instance of a `Cls`, i.e. `Cls("foo", 42)` returns an `Obj`.
|
77
139
|
|
@@ -90,10 +152,9 @@ class _Obj:
|
|
90
152
|
|
91
153
|
def __init__(
|
92
154
|
self,
|
93
|
-
user_cls: type,
|
155
|
+
user_cls: Optional[type], # this would be None in case of lookups
|
94
156
|
class_service_function: Optional[_Function], # only None for <v0.63 classes
|
95
157
|
classbound_methods: dict[str, _Function],
|
96
|
-
from_other_workspace: bool,
|
97
158
|
options: Optional[api_pb2.FunctionOptions],
|
98
159
|
args,
|
99
160
|
kwargs,
|
@@ -107,17 +168,15 @@ class _Obj:
|
|
107
168
|
if class_service_function:
|
108
169
|
# >= v0.63 classes
|
109
170
|
# first create the singular object function used by all methods on this parameterization
|
110
|
-
self._instance_service_function = class_service_function._bind_parameters(
|
111
|
-
self, from_other_workspace, options, args, kwargs
|
112
|
-
)
|
171
|
+
self._instance_service_function = class_service_function._bind_parameters(self, options, args, kwargs)
|
113
172
|
for method_name, class_bound_method in classbound_methods.items():
|
114
|
-
method = self._instance_service_function
|
173
|
+
method = _bind_instance_method(self._instance_service_function, class_bound_method)
|
115
174
|
self._method_functions[method_name] = method
|
116
175
|
else:
|
117
176
|
# looked up <v0.63 classes - bind each individual method to the new parameters
|
118
177
|
self._instance_service_function = None
|
119
178
|
for method_name, class_bound_method in classbound_methods.items():
|
120
|
-
method = class_bound_method._bind_parameters(self,
|
179
|
+
method = class_bound_method._bind_parameters(self, options, args, kwargs)
|
121
180
|
self._method_functions[method_name] = method
|
122
181
|
|
123
182
|
# Used for construction local object lazily
|
@@ -247,7 +306,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
247
306
|
_method_functions: Optional[dict[str, _Function]] = None # Placeholder _Functions for each method
|
248
307
|
_options: Optional[api_pb2.FunctionOptions]
|
249
308
|
_callables: dict[str, Callable[..., Any]]
|
250
|
-
_from_other_workspace: Optional[bool] # Functions require FunctionBindParams before invocation.
|
251
309
|
_app: Optional["modal.app._App"] = None # not set for lookups
|
252
310
|
|
253
311
|
def _initialize_from_empty(self):
|
@@ -255,7 +313,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
255
313
|
self._class_service_function = None
|
256
314
|
self._options = None
|
257
315
|
self._callables = {}
|
258
|
-
self._from_other_workspace = None
|
259
316
|
|
260
317
|
def _initialize_from_other(self, other: "_Cls"):
|
261
318
|
self._user_cls = other._user_cls
|
@@ -263,7 +320,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
263
320
|
self._method_functions = other._method_functions
|
264
321
|
self._options = other._options
|
265
322
|
self._callables = other._callables
|
266
|
-
self._from_other_workspace = other._from_other_workspace
|
267
323
|
|
268
324
|
def _get_partial_functions(self) -> dict[str, _PartialFunction]:
|
269
325
|
if not self._user_cls:
|
@@ -277,7 +333,7 @@ class _Cls(_Object, type_prefix="cs"):
|
|
277
333
|
and self._class_service_function._method_handle_metadata
|
278
334
|
and len(self._class_service_function._method_handle_metadata)
|
279
335
|
):
|
280
|
-
# The class only has a class service
|
336
|
+
# The class only has a class service function and no method placeholders (v0.67+)
|
281
337
|
if self._method_functions:
|
282
338
|
# We're here when the Cls is loaded locally (e.g. _Cls.from_local) so the _method_functions mapping is
|
283
339
|
# populated with (un-hydrated) _Function objects
|
@@ -382,7 +438,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
382
438
|
cls._class_service_function = class_service_function
|
383
439
|
cls._method_functions = method_functions
|
384
440
|
cls._callables = callables
|
385
|
-
cls._from_other_workspace = False
|
386
441
|
return cls
|
387
442
|
|
388
443
|
def _uses_common_service_function(self):
|
@@ -449,7 +504,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
449
504
|
|
450
505
|
rep = f"Ref({app_name})"
|
451
506
|
cls = cls._from_loader(_load_remote, rep, is_another_app=True)
|
452
|
-
cls._from_other_workspace = bool(workspace is not None)
|
453
507
|
return cls
|
454
508
|
|
455
509
|
def with_options(
|
@@ -543,7 +597,6 @@ class _Cls(_Object, type_prefix="cs"):
|
|
543
597
|
self._user_cls,
|
544
598
|
self._class_service_function,
|
545
599
|
self._method_functions,
|
546
|
-
self._from_other_workspace,
|
547
600
|
self._options,
|
548
601
|
args,
|
549
602
|
kwargs,
|
modal/cls.pyi
CHANGED
@@ -19,6 +19,9 @@ T = typing.TypeVar("T")
|
|
19
19
|
|
20
20
|
def _use_annotation_parameters(user_cls) -> bool: ...
|
21
21
|
def _get_class_constructor_signature(user_cls: type) -> inspect.Signature: ...
|
22
|
+
def _bind_instance_method(
|
23
|
+
service_function: modal.functions._Function, class_bound_method: modal.functions._Function
|
24
|
+
): ...
|
22
25
|
|
23
26
|
class _Obj:
|
24
27
|
_functions: dict[str, modal.functions._Function]
|
@@ -30,10 +33,9 @@ class _Obj:
|
|
30
33
|
def _uses_common_service_function(self): ...
|
31
34
|
def __init__(
|
32
35
|
self,
|
33
|
-
user_cls: type,
|
36
|
+
user_cls: typing.Optional[type],
|
34
37
|
class_service_function: typing.Optional[modal.functions._Function],
|
35
38
|
classbound_methods: dict[str, modal.functions._Function],
|
36
|
-
from_other_workspace: bool,
|
37
39
|
options: typing.Optional[modal_proto.api_pb2.FunctionOptions],
|
38
40
|
args,
|
39
41
|
kwargs,
|
@@ -58,10 +60,9 @@ class Obj:
|
|
58
60
|
|
59
61
|
def __init__(
|
60
62
|
self,
|
61
|
-
user_cls: type,
|
63
|
+
user_cls: typing.Optional[type],
|
62
64
|
class_service_function: typing.Optional[modal.functions.Function],
|
63
65
|
classbound_methods: dict[str, modal.functions.Function],
|
64
|
-
from_other_workspace: bool,
|
65
66
|
options: typing.Optional[modal_proto.api_pb2.FunctionOptions],
|
66
67
|
args,
|
67
68
|
kwargs,
|
@@ -90,7 +91,6 @@ class _Cls(modal.object._Object):
|
|
90
91
|
_method_functions: typing.Optional[dict[str, modal.functions._Function]]
|
91
92
|
_options: typing.Optional[modal_proto.api_pb2.FunctionOptions]
|
92
93
|
_callables: dict[str, typing.Callable[..., typing.Any]]
|
93
|
-
_from_other_workspace: typing.Optional[bool]
|
94
94
|
_app: typing.Optional[modal.app._App]
|
95
95
|
|
96
96
|
def _initialize_from_empty(self): ...
|
@@ -142,7 +142,6 @@ class Cls(modal.object.Object):
|
|
142
142
|
_method_functions: typing.Optional[dict[str, modal.functions.Function]]
|
143
143
|
_options: typing.Optional[modal_proto.api_pb2.FunctionOptions]
|
144
144
|
_callables: dict[str, typing.Callable[..., typing.Any]]
|
145
|
-
_from_other_workspace: typing.Optional[bool]
|
146
145
|
_app: typing.Optional[modal.app.App]
|
147
146
|
|
148
147
|
def __init__(self, *args, **kwargs): ...
|
modal/functions.py
CHANGED
@@ -424,68 +424,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
424
424
|
fun._is_method = True
|
425
425
|
return fun
|
426
426
|
|
427
|
-
def _bind_instance_method(self, class_bound_method: "_Function"):
|
428
|
-
"""mdmd:hidden
|
429
|
-
|
430
|
-
Binds an "instance service function" to a specific method.
|
431
|
-
This "dummy" _Function gets no unique object_id and isn't backend-backed at the moment, since all
|
432
|
-
it does it forward invocations to the underlying instance_service_function with the specified method,
|
433
|
-
and we don't support web_config for parameterized methods at the moment.
|
434
|
-
"""
|
435
|
-
# TODO(elias): refactor to not use `_from_loader()` as a crutch for lazy-loading the
|
436
|
-
# underlying instance_service_function. It's currently used in order to take advantage
|
437
|
-
# of resolver logic and get "chained" resolution of lazy loads, even though this thin
|
438
|
-
# object itself doesn't need any "loading"
|
439
|
-
instance_service_function = self
|
440
|
-
assert instance_service_function._obj
|
441
|
-
method_name = class_bound_method._use_method_name
|
442
|
-
full_function_name = f"{class_bound_method._function_name}[parameterized]"
|
443
|
-
|
444
|
-
def hydrate_from_instance_service_function(method_placeholder_fun):
|
445
|
-
method_placeholder_fun._hydrate_from_other(instance_service_function)
|
446
|
-
method_placeholder_fun._obj = instance_service_function._obj
|
447
|
-
method_placeholder_fun._web_url = (
|
448
|
-
class_bound_method._web_url
|
449
|
-
) # TODO: this shouldn't be set when actual parameters are used
|
450
|
-
method_placeholder_fun._function_name = full_function_name
|
451
|
-
method_placeholder_fun._is_generator = class_bound_method._is_generator
|
452
|
-
method_placeholder_fun._cluster_size = class_bound_method._cluster_size
|
453
|
-
method_placeholder_fun._use_method_name = method_name
|
454
|
-
method_placeholder_fun._is_method = True
|
455
|
-
|
456
|
-
async def _load(fun: "_Function", resolver: Resolver, existing_object_id: Optional[str]):
|
457
|
-
# there is currently no actual loading logic executed to create each method on
|
458
|
-
# the *parameterized* instance of a class - it uses the parameter-bound service-function
|
459
|
-
# for the instance. This load method just makes sure to set all attributes after the
|
460
|
-
# `instance_service_function` has been loaded (it's in the `_deps`)
|
461
|
-
hydrate_from_instance_service_function(fun)
|
462
|
-
|
463
|
-
def _deps():
|
464
|
-
if instance_service_function.is_hydrated:
|
465
|
-
# without this check, the common instance_service_function will be reloaded by all methods
|
466
|
-
# TODO(elias): Investigate if we can fix this multi-loader in the resolver - feels like a bug?
|
467
|
-
return []
|
468
|
-
return [instance_service_function]
|
469
|
-
|
470
|
-
rep = f"Method({full_function_name})"
|
471
|
-
|
472
|
-
fun = _Function._from_loader(
|
473
|
-
_load,
|
474
|
-
rep,
|
475
|
-
deps=_deps,
|
476
|
-
hydrate_lazily=True,
|
477
|
-
)
|
478
|
-
if instance_service_function.is_hydrated:
|
479
|
-
# Eager hydration (skip load) if the instance service function is already loaded
|
480
|
-
hydrate_from_instance_service_function(fun)
|
481
|
-
|
482
|
-
fun._info = class_bound_method._info
|
483
|
-
fun._obj = instance_service_function._obj
|
484
|
-
fun._is_method = True
|
485
|
-
fun._app = class_bound_method._app
|
486
|
-
fun._spec = class_bound_method._spec
|
487
|
-
return fun
|
488
|
-
|
489
427
|
@staticmethod
|
490
428
|
def from_args(
|
491
429
|
info: FunctionInfo,
|
@@ -982,7 +920,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
982
920
|
def _bind_parameters(
|
983
921
|
self,
|
984
922
|
obj: "modal.cls._Obj",
|
985
|
-
from_other_workspace: bool,
|
986
923
|
options: Optional[api_pb2.FunctionOptions],
|
987
924
|
args: Sized,
|
988
925
|
kwargs: dict[str, Any],
|
@@ -993,7 +930,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
993
930
|
"""
|
994
931
|
|
995
932
|
# In some cases, reuse the base function, i.e. not create new clones of each method or the "service function"
|
996
|
-
can_use_parent = len(args) + len(kwargs) == 0 and
|
933
|
+
can_use_parent = len(args) + len(kwargs) == 0 and options is None
|
997
934
|
parent = self
|
998
935
|
|
999
936
|
async def _load(param_bound_func: _Function, resolver: Resolver, existing_object_id: Optional[str]):
|
modal/functions.pyi
CHANGED
@@ -150,7 +150,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.
|
|
150
150
|
_method_handle_metadata: typing.Optional[dict[str, modal_proto.api_pb2.FunctionHandleMetadata]]
|
151
151
|
|
152
152
|
def _bind_method(self, user_cls, method_name: str, partial_function: modal.partial_function._PartialFunction): ...
|
153
|
-
def _bind_instance_method(self, class_bound_method: _Function): ...
|
154
153
|
@staticmethod
|
155
154
|
def from_args(
|
156
155
|
info: modal._utils.function_utils.FunctionInfo,
|
@@ -200,7 +199,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.
|
|
200
199
|
def _bind_parameters(
|
201
200
|
self,
|
202
201
|
obj: modal.cls._Obj,
|
203
|
-
from_other_workspace: bool,
|
204
202
|
options: typing.Optional[modal_proto.api_pb2.FunctionOptions],
|
205
203
|
args: collections.abc.Sized,
|
206
204
|
kwargs: dict[str, typing.Any],
|
@@ -320,7 +318,6 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
320
318
|
|
321
319
|
def __init__(self, *args, **kwargs): ...
|
322
320
|
def _bind_method(self, user_cls, method_name: str, partial_function: modal.partial_function.PartialFunction): ...
|
323
|
-
def _bind_instance_method(self, class_bound_method: Function): ...
|
324
321
|
@staticmethod
|
325
322
|
def from_args(
|
326
323
|
info: modal._utils.function_utils.FunctionInfo,
|
@@ -370,7 +367,6 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
370
367
|
def _bind_parameters(
|
371
368
|
self,
|
372
369
|
obj: modal.cls.Obj,
|
373
|
-
from_other_workspace: bool,
|
374
370
|
options: typing.Optional[modal_proto.api_pb2.FunctionOptions],
|
375
371
|
args: collections.abc.Sized,
|
376
372
|
kwargs: dict[str, typing.Any],
|
@@ -459,11 +455,11 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
459
455
|
|
460
456
|
_call_generator_nowait: ___call_generator_nowait_spec
|
461
457
|
|
462
|
-
class __remote_spec(typing_extensions.Protocol[
|
458
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
463
459
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
464
460
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
465
461
|
|
466
|
-
remote: __remote_spec[
|
462
|
+
remote: __remote_spec[P, ReturnType]
|
467
463
|
|
468
464
|
class __remote_gen_spec(typing_extensions.Protocol):
|
469
465
|
def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -475,17 +471,17 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
475
471
|
def _get_obj(self) -> typing.Optional[modal.cls.Obj]: ...
|
476
472
|
def local(self, *args: P.args, **kwargs: P.kwargs) -> OriginalReturnType: ...
|
477
473
|
|
478
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
474
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
479
475
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
480
476
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
481
477
|
|
482
|
-
_experimental_spawn: ___experimental_spawn_spec[
|
478
|
+
_experimental_spawn: ___experimental_spawn_spec[P, ReturnType]
|
483
479
|
|
484
|
-
class __spawn_spec(typing_extensions.Protocol[
|
480
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
485
481
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
486
482
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
487
483
|
|
488
|
-
spawn: __spawn_spec[
|
484
|
+
spawn: __spawn_spec[P, ReturnType]
|
489
485
|
|
490
486
|
def get_raw_f(self) -> typing.Callable[..., typing.Any]: ...
|
491
487
|
|
@@ -19,11 +19,11 @@ modal/app.py,sha256=EJ7FUN6rWnSwLJoYJh8nmKg_t-8hdN8_rt0OrkP7JvQ,46084
|
|
19
19
|
modal/app.pyi,sha256=BE5SlR5tRECuc6-e2lUuOknDdov3zxgZ4N0AsLb5ZVQ,25270
|
20
20
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
21
21
|
modal/client.py,sha256=VMg_aIuo_LOEe2ttxBHEND3PLhTp5lo-onH4wELhIyY,16375
|
22
|
-
modal/client.pyi,sha256=
|
22
|
+
modal/client.pyi,sha256=U2SbKMmiIMBV8qZdf-9-h31sv4t8zKJnv4PivYkQY8g,7354
|
23
23
|
modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
|
24
24
|
modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
|
25
|
-
modal/cls.py,sha256=
|
26
|
-
modal/cls.pyi,sha256=
|
25
|
+
modal/cls.py,sha256=FixKHMcZAm8st5Gkw_Pq8zRqnlrRwBSbY6VlGyPG194,27335
|
26
|
+
modal/cls.pyi,sha256=47jaIT06fz8PSUrs-MaNn6r03PHsAyUGsKuK5e9RMhQ,8140
|
27
27
|
modal/config.py,sha256=1KhNJkjYsJkX1V8RPPdRYPlM2HE-ZZs0JVSxbiXjmrw,11010
|
28
28
|
modal/container_process.py,sha256=YRCKjn56oqTtGjtLxpl_KSkOhYrcRitgF3LOI6o14Q4,5759
|
29
29
|
modal/container_process.pyi,sha256=k2kClwaSzz11eci1pzFZgCm-ptXapHAyHTOENorlazA,2594
|
@@ -33,8 +33,8 @@ modal/environments.py,sha256=5cgA-zbm6ngKLsRA19zSOgtgo9-BarJK3FJK0BiF2Lo,6505
|
|
33
33
|
modal/environments.pyi,sha256=XalNpiPkAtHWAvOU2Cotq0ozmtl-Jv0FDsR8h9mr27Q,3521
|
34
34
|
modal/exception.py,sha256=EBkdWVved2XEPsXaoPRu56xfxFFHL9iuqvUsdj42WDA,6392
|
35
35
|
modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
|
36
|
-
modal/functions.py,sha256=
|
37
|
-
modal/functions.pyi,sha256=
|
36
|
+
modal/functions.py,sha256=Lteg8dMa8ly72-RM1ozxeGQ500pdeFyJgtflVwp3U7Q,66629
|
37
|
+
modal/functions.pyi,sha256=3Jupx4QKaqQ9p9XQSG4zDjB3W-87EYkFg55w2QuSQ8M,24892
|
38
38
|
modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
|
39
39
|
modal/image.py,sha256=ZIC8tgjJnqWamN4sZ0Gch3x2VmcM671MWfRLR5SMmoc,79423
|
40
40
|
modal/image.pyi,sha256=JjicLNuaBsfuPZ_xo_eN0zKZkDrEm2alYg-szENhJjM,24591
|
@@ -83,7 +83,7 @@ modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
|
83
83
|
modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
|
84
84
|
modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
|
85
85
|
modal/_utils/blob_utils.py,sha256=0k_qUpO5GHnz538wjRhyRw4NdJ5O322N7QSilIu32jw,16601
|
86
|
-
modal/_utils/function_utils.py,sha256=
|
86
|
+
modal/_utils/function_utils.py,sha256=GV-mq6sSGXQIX5PcExYWJMaWY9YLjChjsiQjg-oPvm8,24902
|
87
87
|
modal/_utils/grpc_testing.py,sha256=iqM9n5M0cWUUIIWNaEDer_pIfPnzXdZBO4L8FVbNepQ,8309
|
88
88
|
modal/_utils/grpc_utils.py,sha256=PPB5ay-vXencXNIWPVw5modr3EH7gfq2QPcO5YJ1lMU,7737
|
89
89
|
modal/_utils/hash_utils.py,sha256=xKwSI1eQobyWNdJwyLO59eB241LOXmQ6QvtzJsyIMcw,1784
|
@@ -159,10 +159,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
159
159
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
160
160
|
modal_version/__init__.py,sha256=3IY-AWLH55r35_mQXIaut0jrJvoPuf1NZJBQQfSbPuo,470
|
161
161
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
162
|
-
modal_version/_version_generated.py,sha256=
|
163
|
-
modal-0.67.
|
164
|
-
modal-0.67.
|
165
|
-
modal-0.67.
|
166
|
-
modal-0.67.
|
167
|
-
modal-0.67.
|
168
|
-
modal-0.67.
|
162
|
+
modal_version/_version_generated.py,sha256=ywXYELd_KsMic3fpfOjfFoR6nTm4q6RO_003ggU16KY,149
|
163
|
+
modal-0.67.27.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
164
|
+
modal-0.67.27.dist-info/METADATA,sha256=zzEw1NV467f49iFBnn2iIwCl0YDrISHZ0FSh6z6VXdA,2329
|
165
|
+
modal-0.67.27.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
166
|
+
modal-0.67.27.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
167
|
+
modal-0.67.27.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
168
|
+
modal-0.67.27.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|