modal 1.0.6.dev59__py3-none-any.whl → 1.0.6.dev61__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 +3 -11
- modal/_utils/function_utils.py +0 -28
- modal/app.py +8 -7
- modal/app.pyi +4 -4
- modal/client.pyi +2 -2
- modal/functions.pyi +7 -7
- modal/image.py +12 -7
- modal/image.pyi +24 -14
- modal/sandbox.py +4 -1
- modal/sandbox.pyi +12 -3
- modal/volume.py +2 -0
- modal/volume.pyi +4 -0
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/METADATA +1 -1
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/RECORD +19 -19
- modal_version/__init__.py +1 -1
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/WHEEL +0 -0
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/entry_points.txt +0 -0
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.6.dev59.dist-info → modal-1.0.6.dev61.dist-info}/top_level.txt +0 -0
modal/_functions.py
CHANGED
@@ -47,12 +47,10 @@ from ._utils.function_utils import (
|
|
47
47
|
OUTPUTS_TIMEOUT,
|
48
48
|
FunctionCreationStatus,
|
49
49
|
FunctionInfo,
|
50
|
-
IncludeSourceMode,
|
51
50
|
_create_input,
|
52
51
|
_process_result,
|
53
52
|
_stream_function_call_data,
|
54
53
|
get_function_type,
|
55
|
-
get_include_source_mode,
|
56
54
|
is_async,
|
57
55
|
)
|
58
56
|
from ._utils.grpc_utils import RetryWarningMessage, retry_transient_errors
|
@@ -598,8 +596,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
598
596
|
rdma: Optional[bool] = None,
|
599
597
|
max_inputs: Optional[int] = None,
|
600
598
|
ephemeral_disk: Optional[int] = None,
|
601
|
-
|
602
|
-
include_source: Optional[bool] = None,
|
599
|
+
include_source: bool = True,
|
603
600
|
experimental_options: Optional[dict[str, str]] = None,
|
604
601
|
_experimental_proxy_ip: Optional[str] = None,
|
605
602
|
_experimental_custom_scaling_factor: Optional[float] = None,
|
@@ -624,15 +621,10 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
624
621
|
assert not webhook_config
|
625
622
|
assert not schedule
|
626
623
|
|
627
|
-
|
628
|
-
if include_source_mode != IncludeSourceMode.INCLUDE_NOTHING:
|
629
|
-
entrypoint_mounts = info.get_entrypoint_mount()
|
630
|
-
else:
|
631
|
-
entrypoint_mounts = {}
|
632
|
-
|
624
|
+
entrypoint_mount = info.get_entrypoint_mount() if include_source else {}
|
633
625
|
all_mounts = [
|
634
626
|
_get_client_mount(),
|
635
|
-
*
|
627
|
+
*entrypoint_mount.values(),
|
636
628
|
]
|
637
629
|
|
638
630
|
retry_policy = _parse_retries(
|
modal/_utils/function_utils.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# Copyright Modal Labs 2022
|
2
2
|
import asyncio
|
3
|
-
import enum
|
4
3
|
import inspect
|
5
4
|
import os
|
6
5
|
from collections.abc import AsyncGenerator
|
@@ -660,30 +659,3 @@ class FunctionCreationStatus:
|
|
660
659
|
f"Custom domain for {method_definition.function_name} => [magenta underline]"
|
661
660
|
f"{custom_domain.url}[/magenta underline]"
|
662
661
|
)
|
663
|
-
|
664
|
-
|
665
|
-
class IncludeSourceMode(enum.Enum):
|
666
|
-
INCLUDE_NOTHING = False # can only be set in source, can't be set in config
|
667
|
-
INCLUDE_MAIN_PACKAGE = True # Default behavior
|
668
|
-
|
669
|
-
|
670
|
-
def get_include_source_mode(function_or_app_specific) -> IncludeSourceMode:
|
671
|
-
"""Which "automount" behavior should a function use
|
672
|
-
|
673
|
-
function_or_app_specific: explicit value given in the @function or @cls decorator, in an App constructor, or None
|
674
|
-
|
675
|
-
If function_or_app_specific is specified, validate and return the IncludeSourceMode
|
676
|
-
If function_or_app_specific is None, infer it from config
|
677
|
-
"""
|
678
|
-
if function_or_app_specific is not None:
|
679
|
-
if not isinstance(function_or_app_specific, bool):
|
680
|
-
raise ValueError(
|
681
|
-
f"Invalid `include_source` value: {function_or_app_specific}. Use one of:\n"
|
682
|
-
f"True - include function's package source\n"
|
683
|
-
f"False - include no Python source (module expected to be present in Image)\n"
|
684
|
-
)
|
685
|
-
|
686
|
-
# explicitly set in app/function
|
687
|
-
return IncludeSourceMode(function_or_app_specific)
|
688
|
-
|
689
|
-
return IncludeSourceMode.INCLUDE_MAIN_PACKAGE
|
modal/app.py
CHANGED
@@ -171,10 +171,10 @@ class _App:
|
|
171
171
|
self,
|
172
172
|
name: Optional[str] = None,
|
173
173
|
*,
|
174
|
-
image: Optional[_Image] = None, #
|
175
|
-
secrets: Sequence[_Secret] = [], #
|
176
|
-
volumes: dict[Union[str, PurePosixPath], _Volume] = {}, #
|
177
|
-
include_source:
|
174
|
+
image: Optional[_Image] = None, # Default Image for the App (otherwise default to `modal.Image.debian_slim()`)
|
175
|
+
secrets: Sequence[_Secret] = [], # Secrets to add for all Functions in the App
|
176
|
+
volumes: dict[Union[str, PurePosixPath], _Volume] = {}, # Volume mounts to use for all Functions
|
177
|
+
include_source: bool = True, # Default configuration for adding Function source file(s) to the Modal container
|
178
178
|
) -> None:
|
179
179
|
"""Construct a new app, optionally with default image, mounts, secrets, or volumes.
|
180
180
|
|
@@ -655,8 +655,9 @@ class _App:
|
|
655
655
|
# With `max_inputs = 1`, containers will be single-use.
|
656
656
|
max_inputs: Optional[int] = None,
|
657
657
|
i6pn: Optional[bool] = None, # Whether to enable IPv6 container networking within the region.
|
658
|
-
# Whether the
|
659
|
-
|
658
|
+
# Whether the file or directory containing the Function's source should automatically be included
|
659
|
+
# in the container. When unset, falls back to the App-level configuration, or is otherwise True by default.
|
660
|
+
include_source: Optional[bool] = None,
|
660
661
|
experimental_options: Optional[dict[str, Any]] = None,
|
661
662
|
# Parameters below here are experimental. Use with caution!
|
662
663
|
_experimental_scheduler_placement: Optional[
|
@@ -670,8 +671,8 @@ class _App:
|
|
670
671
|
concurrency_limit: Optional[int] = None, # Replaced with `max_containers`
|
671
672
|
container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
|
672
673
|
allow_concurrent_inputs: Optional[int] = None, # Replaced with the `@modal.concurrent` decorator
|
673
|
-
_experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
|
674
674
|
allow_cross_region_volumes: Optional[bool] = None, # Always True on the Modal backend now
|
675
|
+
_experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
|
675
676
|
) -> _FunctionDecoratorType:
|
676
677
|
"""Decorator to register a new Modal Function with this App."""
|
677
678
|
if isinstance(_warn_parentheses_missing, _Image):
|
modal/app.pyi
CHANGED
@@ -129,7 +129,7 @@ class _App:
|
|
129
129
|
image: typing.Optional[modal.image._Image] = None,
|
130
130
|
secrets: collections.abc.Sequence[modal.secret._Secret] = [],
|
131
131
|
volumes: dict[typing.Union[str, pathlib.PurePosixPath], modal.volume._Volume] = {},
|
132
|
-
include_source:
|
132
|
+
include_source: bool = True,
|
133
133
|
) -> None:
|
134
134
|
"""Construct a new app, optionally with default image, mounts, secrets, or volumes.
|
135
135
|
|
@@ -430,8 +430,8 @@ class _App:
|
|
430
430
|
concurrency_limit: typing.Optional[int] = None,
|
431
431
|
container_idle_timeout: typing.Optional[int] = None,
|
432
432
|
allow_concurrent_inputs: typing.Optional[int] = None,
|
433
|
-
_experimental_buffer_containers: typing.Optional[int] = None,
|
434
433
|
allow_cross_region_volumes: typing.Optional[bool] = None,
|
434
|
+
_experimental_buffer_containers: typing.Optional[int] = None,
|
435
435
|
) -> _FunctionDecoratorType:
|
436
436
|
"""Decorator to register a new Modal Function with this App."""
|
437
437
|
...
|
@@ -591,7 +591,7 @@ class App:
|
|
591
591
|
image: typing.Optional[modal.image.Image] = None,
|
592
592
|
secrets: collections.abc.Sequence[modal.secret.Secret] = [],
|
593
593
|
volumes: dict[typing.Union[str, pathlib.PurePosixPath], modal.volume.Volume] = {},
|
594
|
-
include_source:
|
594
|
+
include_source: bool = True,
|
595
595
|
) -> None:
|
596
596
|
"""Construct a new app, optionally with default image, mounts, secrets, or volumes.
|
597
597
|
|
@@ -1035,8 +1035,8 @@ class App:
|
|
1035
1035
|
concurrency_limit: typing.Optional[int] = None,
|
1036
1036
|
container_idle_timeout: typing.Optional[int] = None,
|
1037
1037
|
allow_concurrent_inputs: typing.Optional[int] = None,
|
1038
|
-
_experimental_buffer_containers: typing.Optional[int] = None,
|
1039
1038
|
allow_cross_region_volumes: typing.Optional[bool] = None,
|
1039
|
+
_experimental_buffer_containers: typing.Optional[int] = None,
|
1040
1040
|
) -> _FunctionDecoratorType:
|
1041
1041
|
"""Decorator to register a new Modal Function with this App."""
|
1042
1042
|
...
|
modal/client.pyi
CHANGED
@@ -33,7 +33,7 @@ class _Client:
|
|
33
33
|
server_url: str,
|
34
34
|
client_type: int,
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
36
|
-
version: str = "1.0.6.
|
36
|
+
version: str = "1.0.6.dev61",
|
37
37
|
):
|
38
38
|
"""mdmd:hidden
|
39
39
|
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.0.6.
|
166
|
+
version: str = "1.0.6.dev61",
|
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
@@ -105,7 +105,7 @@ class Function(
|
|
105
105
|
rdma: typing.Optional[bool] = None,
|
106
106
|
max_inputs: typing.Optional[int] = None,
|
107
107
|
ephemeral_disk: typing.Optional[int] = None,
|
108
|
-
include_source:
|
108
|
+
include_source: bool = True,
|
109
109
|
experimental_options: typing.Optional[dict[str, str]] = None,
|
110
110
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
111
111
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
@@ -428,7 +428,7 @@ class Function(
|
|
428
428
|
|
429
429
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
430
430
|
|
431
|
-
class __remote_spec(typing_extensions.Protocol[
|
431
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
432
432
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
433
433
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
434
434
|
...
|
@@ -437,7 +437,7 @@ class Function(
|
|
437
437
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
438
438
|
...
|
439
439
|
|
440
|
-
remote: __remote_spec[modal._functions.
|
440
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
441
441
|
|
442
442
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
443
443
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
@@ -464,7 +464,7 @@ class Function(
|
|
464
464
|
"""
|
465
465
|
...
|
466
466
|
|
467
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
467
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
468
468
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
469
469
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
470
470
|
|
@@ -488,7 +488,7 @@ class Function(
|
|
488
488
|
...
|
489
489
|
|
490
490
|
_experimental_spawn: ___experimental_spawn_spec[
|
491
|
-
modal._functions.
|
491
|
+
modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
|
492
492
|
]
|
493
493
|
|
494
494
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
@@ -497,7 +497,7 @@ class Function(
|
|
497
497
|
|
498
498
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
499
499
|
|
500
|
-
class __spawn_spec(typing_extensions.Protocol[
|
500
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
501
501
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
502
502
|
"""Calls the function with the given arguments, without waiting for the results.
|
503
503
|
|
@@ -518,7 +518,7 @@ class Function(
|
|
518
518
|
"""
|
519
519
|
...
|
520
520
|
|
521
|
-
spawn: __spawn_spec[modal._functions.
|
521
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
522
522
|
|
523
523
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
524
524
|
"""Return the inner Python object wrapped by this Modal Function."""
|
modal/image.py
CHANGED
@@ -1157,6 +1157,8 @@ class _Image(_Object, type_prefix="im"):
|
|
1157
1157
|
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
1158
1158
|
- Shell supports backticks for substitution
|
1159
1159
|
- `which` command is on the `$PATH`
|
1160
|
+
|
1161
|
+
Added in v1.1.0.
|
1160
1162
|
"""
|
1161
1163
|
pkgs = _flatten_str_args("uv_pip_install", "packages", packages)
|
1162
1164
|
|
@@ -1347,6 +1349,8 @@ class _Image(_Object, type_prefix="im"):
|
|
1347
1349
|
```python
|
1348
1350
|
image = modal.Image.debian_slim().uv_sync()
|
1349
1351
|
```
|
1352
|
+
|
1353
|
+
Added in v1.1.0.
|
1350
1354
|
"""
|
1351
1355
|
|
1352
1356
|
def _normalize_items(items, name) -> list[str]:
|
@@ -2091,23 +2095,24 @@ class _Image(_Object, type_prefix="im"):
|
|
2091
2095
|
raw_f: Callable[..., Any],
|
2092
2096
|
*,
|
2093
2097
|
secrets: Sequence[_Secret] = (), # Optional Modal Secret objects with environment variables for the container
|
2094
|
-
gpu: Union[GPU_T, list[GPU_T]] = None, # Requested GPU or or list of acceptable GPUs( e.g. ["A10", "A100"])
|
2095
2098
|
volumes: dict[Union[str, PurePosixPath], Union[_Volume, _CloudBucketMount]] = {}, # Volume mount paths
|
2096
2099
|
network_file_systems: dict[Union[str, PurePosixPath], _NetworkFileSystem] = {}, # NFS mount paths
|
2100
|
+
gpu: Union[GPU_T, list[GPU_T]] = None, # Requested GPU or or list of acceptable GPUs( e.g. ["A10", "A100"])
|
2097
2101
|
cpu: Optional[float] = None, # How many CPU cores to request. This is a soft limit.
|
2098
2102
|
memory: Optional[int] = None, # How much memory to request, in MiB. This is a soft limit.
|
2099
2103
|
timeout: Optional[int] = 60 * 60, # Maximum execution time of the function in seconds.
|
2100
|
-
force_build: bool = False, # Ignore cached builds, similar to 'docker build --no-cache'
|
2101
2104
|
cloud: Optional[str] = None, # Cloud provider to run the function on. Possible values are aws, gcp, oci, auto.
|
2102
2105
|
region: Optional[Union[str, Sequence[str]]] = None, # Region or regions to run the function on.
|
2106
|
+
force_build: bool = False, # Ignore cached builds, similar to 'docker build --no-cache'
|
2103
2107
|
args: Sequence[Any] = (), # Positional arguments to the function.
|
2104
2108
|
kwargs: dict[str, Any] = {}, # Keyword arguments to the function.
|
2105
|
-
include_source:
|
2109
|
+
include_source: bool = True, # Whether the builder container should have the Function's source added
|
2106
2110
|
) -> "_Image":
|
2107
|
-
"""Run user-defined function `raw_f` as an image build step.
|
2108
|
-
|
2109
|
-
|
2110
|
-
|
2111
|
+
"""Run user-defined function `raw_f` as an image build step.
|
2112
|
+
|
2113
|
+
The function runs like an ordinary Modal Function, accepting a resource configuration and integrating
|
2114
|
+
with Modal features like Secrets and Volumes. Unlike ordinary Modal Functions, any changes to the
|
2115
|
+
filesystem state will be captured on container exit and saved as a new Image.
|
2111
2116
|
|
2112
2117
|
**Note**
|
2113
2118
|
|
modal/image.pyi
CHANGED
@@ -470,6 +470,8 @@ class _Image(modal._object._Object):
|
|
470
470
|
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
471
471
|
- Shell supports backticks for substitution
|
472
472
|
- `which` command is on the `$PATH`
|
473
|
+
|
474
|
+
Added in v1.1.0.
|
473
475
|
"""
|
474
476
|
...
|
475
477
|
|
@@ -521,6 +523,8 @@ class _Image(modal._object._Object):
|
|
521
523
|
```python
|
522
524
|
image = modal.Image.debian_slim().uv_sync()
|
523
525
|
```
|
526
|
+
|
527
|
+
Added in v1.1.0.
|
524
528
|
"""
|
525
529
|
...
|
526
530
|
|
@@ -829,7 +833,6 @@ class _Image(modal._object._Object):
|
|
829
833
|
raw_f: collections.abc.Callable[..., typing.Any],
|
830
834
|
*,
|
831
835
|
secrets: collections.abc.Sequence[modal.secret._Secret] = (),
|
832
|
-
gpu: typing.Union[None, str, modal.gpu._GPUConfig, list[typing.Union[None, str, modal.gpu._GPUConfig]]] = None,
|
833
836
|
volumes: dict[
|
834
837
|
typing.Union[str, pathlib.PurePosixPath],
|
835
838
|
typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
|
@@ -837,20 +840,22 @@ class _Image(modal._object._Object):
|
|
837
840
|
network_file_systems: dict[
|
838
841
|
typing.Union[str, pathlib.PurePosixPath], modal.network_file_system._NetworkFileSystem
|
839
842
|
] = {},
|
843
|
+
gpu: typing.Union[None, str, modal.gpu._GPUConfig, list[typing.Union[None, str, modal.gpu._GPUConfig]]] = None,
|
840
844
|
cpu: typing.Optional[float] = None,
|
841
845
|
memory: typing.Optional[int] = None,
|
842
846
|
timeout: typing.Optional[int] = 3600,
|
843
|
-
force_build: bool = False,
|
844
847
|
cloud: typing.Optional[str] = None,
|
845
848
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
849
|
+
force_build: bool = False,
|
846
850
|
args: collections.abc.Sequence[typing.Any] = (),
|
847
851
|
kwargs: dict[str, typing.Any] = {},
|
848
|
-
include_source:
|
852
|
+
include_source: bool = True,
|
849
853
|
) -> _Image:
|
850
|
-
"""Run user-defined function `raw_f` as an image build step.
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
+
"""Run user-defined function `raw_f` as an image build step.
|
855
|
+
|
856
|
+
The function runs like an ordinary Modal Function, accepting a resource configuration and integrating
|
857
|
+
with Modal features like Secrets and Volumes. Unlike ordinary Modal Functions, any changes to the
|
858
|
+
filesystem state will be captured on container exit and saved as a new Image.
|
854
859
|
|
855
860
|
**Note**
|
856
861
|
|
@@ -1305,6 +1310,8 @@ class Image(modal.object.Object):
|
|
1305
1310
|
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
1306
1311
|
- Shell supports backticks for substitution
|
1307
1312
|
- `which` command is on the `$PATH`
|
1313
|
+
|
1314
|
+
Added in v1.1.0.
|
1308
1315
|
"""
|
1309
1316
|
...
|
1310
1317
|
|
@@ -1356,6 +1363,8 @@ class Image(modal.object.Object):
|
|
1356
1363
|
```python
|
1357
1364
|
image = modal.Image.debian_slim().uv_sync()
|
1358
1365
|
```
|
1366
|
+
|
1367
|
+
Added in v1.1.0.
|
1359
1368
|
"""
|
1360
1369
|
...
|
1361
1370
|
|
@@ -1664,7 +1673,6 @@ class Image(modal.object.Object):
|
|
1664
1673
|
raw_f: collections.abc.Callable[..., typing.Any],
|
1665
1674
|
*,
|
1666
1675
|
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
1667
|
-
gpu: typing.Union[None, str, modal.gpu._GPUConfig, list[typing.Union[None, str, modal.gpu._GPUConfig]]] = None,
|
1668
1676
|
volumes: dict[
|
1669
1677
|
typing.Union[str, pathlib.PurePosixPath],
|
1670
1678
|
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
@@ -1672,20 +1680,22 @@ class Image(modal.object.Object):
|
|
1672
1680
|
network_file_systems: dict[
|
1673
1681
|
typing.Union[str, pathlib.PurePosixPath], modal.network_file_system.NetworkFileSystem
|
1674
1682
|
] = {},
|
1683
|
+
gpu: typing.Union[None, str, modal.gpu._GPUConfig, list[typing.Union[None, str, modal.gpu._GPUConfig]]] = None,
|
1675
1684
|
cpu: typing.Optional[float] = None,
|
1676
1685
|
memory: typing.Optional[int] = None,
|
1677
1686
|
timeout: typing.Optional[int] = 3600,
|
1678
|
-
force_build: bool = False,
|
1679
1687
|
cloud: typing.Optional[str] = None,
|
1680
1688
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
1689
|
+
force_build: bool = False,
|
1681
1690
|
args: collections.abc.Sequence[typing.Any] = (),
|
1682
1691
|
kwargs: dict[str, typing.Any] = {},
|
1683
|
-
include_source:
|
1692
|
+
include_source: bool = True,
|
1684
1693
|
) -> Image:
|
1685
|
-
"""Run user-defined function `raw_f` as an image build step.
|
1686
|
-
|
1687
|
-
|
1688
|
-
|
1694
|
+
"""Run user-defined function `raw_f` as an image build step.
|
1695
|
+
|
1696
|
+
The function runs like an ordinary Modal Function, accepting a resource configuration and integrating
|
1697
|
+
with Modal features like Secrets and Volumes. Unlike ordinary Modal Functions, any changes to the
|
1698
|
+
filesystem state will be captured on container exit and saved as a new Image.
|
1689
1699
|
|
1690
1700
|
**Note**
|
1691
1701
|
|
modal/sandbox.py
CHANGED
@@ -546,7 +546,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
546
546
|
return self._tunnels
|
547
547
|
|
548
548
|
async def reload_volumes(self) -> None:
|
549
|
-
"""Reload all Volumes mounted in the Sandbox.
|
549
|
+
"""Reload all Volumes mounted in the Sandbox.
|
550
|
+
|
551
|
+
Added in v1.1.0.
|
552
|
+
"""
|
550
553
|
task_id = await self._get_task_id()
|
551
554
|
await retry_transient_errors(
|
552
555
|
self._client.stub.ContainerReloadVolumes,
|
modal/sandbox.pyi
CHANGED
@@ -188,7 +188,10 @@ class _Sandbox(modal._object._Object):
|
|
188
188
|
...
|
189
189
|
|
190
190
|
async def reload_volumes(self) -> None:
|
191
|
-
"""Reload all Volumes mounted in the Sandbox.
|
191
|
+
"""Reload all Volumes mounted in the Sandbox.
|
192
|
+
|
193
|
+
Added in v1.1.0.
|
194
|
+
"""
|
192
195
|
...
|
193
196
|
|
194
197
|
async def terminate(self) -> None:
|
@@ -615,11 +618,17 @@ class Sandbox(modal.object.Object):
|
|
615
618
|
|
616
619
|
class __reload_volumes_spec(typing_extensions.Protocol[SUPERSELF]):
|
617
620
|
def __call__(self, /) -> None:
|
618
|
-
"""Reload all Volumes mounted in the Sandbox.
|
621
|
+
"""Reload all Volumes mounted in the Sandbox.
|
622
|
+
|
623
|
+
Added in v1.1.0.
|
624
|
+
"""
|
619
625
|
...
|
620
626
|
|
621
627
|
async def aio(self, /) -> None:
|
622
|
-
"""Reload all Volumes mounted in the Sandbox.
|
628
|
+
"""Reload all Volumes mounted in the Sandbox.
|
629
|
+
|
630
|
+
Added in v1.1.0.
|
631
|
+
"""
|
623
632
|
...
|
624
633
|
|
625
634
|
reload_volumes: __reload_volumes_spec[typing_extensions.Self]
|
modal/volume.py
CHANGED
@@ -156,6 +156,8 @@ class _Volume(_Object, type_prefix="vo"):
|
|
156
156
|
|
157
157
|
The Volume is mounted as a read-only volume in a function. Any file system write operation into the
|
158
158
|
mounted volume will result in an error.
|
159
|
+
|
160
|
+
Added in v1.0.5.
|
159
161
|
"""
|
160
162
|
|
161
163
|
async def _load(new_volume: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
|
modal/volume.pyi
CHANGED
@@ -121,6 +121,8 @@ class _Volume(modal._object._Object):
|
|
121
121
|
|
122
122
|
The Volume is mounted as a read-only volume in a function. Any file system write operation into the
|
123
123
|
mounted volume will result in an error.
|
124
|
+
|
125
|
+
Added in v1.0.5.
|
124
126
|
"""
|
125
127
|
...
|
126
128
|
|
@@ -417,6 +419,8 @@ class Volume(modal.object.Object):
|
|
417
419
|
|
418
420
|
The Volume is mounted as a read-only volume in a function. Any file system write operation into the
|
419
421
|
mounted volume will result in an error.
|
422
|
+
|
423
|
+
Added in v1.0.5.
|
420
424
|
"""
|
421
425
|
...
|
422
426
|
|
@@ -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=_QKM87tdYwcALSGth8a0-9qXl02fZK6zMfEGEoYz7eA,1007
|
5
5
|
modal/_container_entrypoint.py,sha256=1qBMNY_E9ICC_sRCtillMxmKPsmxJl1J0_qOAG8rH-0,28288
|
6
|
-
modal/_functions.py,sha256=
|
6
|
+
modal/_functions.py,sha256=sfE0cYRMGIr22zhCNGH2VBVLuuxQx4WNM7h1LqdTYNI,80869
|
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=vzRWhAcFJDM8ZmiUSDgSj9gJhLZJA-wjLVvTl984N4A,11295
|
@@ -18,11 +18,11 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
|
|
18
18
|
modal/_tunnel.pyi,sha256=rvC7USR2BcKkbZIeCJXwf7-UfGE-LPLjKsGNiK7Lxa4,13366
|
19
19
|
modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
|
20
20
|
modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
|
21
|
-
modal/app.py,sha256=
|
22
|
-
modal/app.pyi,sha256=
|
21
|
+
modal/app.py,sha256=BBR2NmGzZbFGfhKAmtzllD0o4TbVDBbOEs0O2ysSdQo,48277
|
22
|
+
modal/app.pyi,sha256=h6JtBA6a7wobdZAuS3QuXrWCUZqfyKPuGV3XdjCqT3k,43753
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=pBSZ7lv5dezIL9U9H4tpE0Yz6qA1n0NoNbnJ3KCQMMA,18252
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=IJcV98G7PkXHQXA1dW0kaBHPn421H7bpkdfSC8qUvOA,15390
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
|
28
28
|
modal/cls.py,sha256=7A0xGnugQzm8dOfnKMjLjtqekRlRtQ0jPFRYgq6xdUM,40018
|
@@ -39,10 +39,10 @@ modal/file_io.py,sha256=BVqAJ0sgPUfN8QsYztWiGB4j56he60TncM02KsylnCw,21449
|
|
39
39
|
modal/file_io.pyi,sha256=cPT_hsplE5iLCXhYOLn1Sp9eDdk7DxdFmicQHanJZyg,15918
|
40
40
|
modal/file_pattern_matcher.py,sha256=urAue8es8jxqX94k9EYoZxxhtfgOlsEES8lbFHOorzc,7734
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
|
-
modal/functions.pyi,sha256=
|
42
|
+
modal/functions.pyi,sha256=sht8252nY3f7y20vURdjz4R-NU0_EvHjHVl97PQ1t_4,34823
|
43
43
|
modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
|
44
|
-
modal/image.py,sha256=
|
45
|
-
modal/image.pyi,sha256=
|
44
|
+
modal/image.py,sha256=0E3Tge4W3JLS-8dzFy1AVlkdccMhYs3TQkv5kQwv3G0,102368
|
45
|
+
modal/image.pyi,sha256=s_AQaFoWmjLzffJGmiedFf9K1qQkedVIlsC6vRtlKS8,68161
|
46
46
|
modal/io_streams.py,sha256=ut9tY_yEtiBsgQ40u_72Ns87IZHfbMxfnh8t6U9RSGA,16204
|
47
47
|
modal/io_streams.pyi,sha256=aOun_jUFKHSJyUY6-7gKvNoxzcULsa8_hxdtEO7v-gk,13980
|
48
48
|
modal/mount.py,sha256=q-pPeVxAmte-G_LDpbFwaNs2Rb2MIpscfnCXzkhxrOI,36734
|
@@ -65,8 +65,8 @@ modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
|
|
65
65
|
modal/runner.py,sha256=ostdzYpQb-20tlD6dIq7bpWTkZkOhjJBNuMNektqnJA,24068
|
66
66
|
modal/runner.pyi,sha256=lbwLljm1cC8d6PcNvmYQhkE8501V9fg0bYqqKX6G4r4,8489
|
67
67
|
modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
|
68
|
-
modal/sandbox.py,sha256=
|
69
|
-
modal/sandbox.pyi,sha256=
|
68
|
+
modal/sandbox.py,sha256=5n4bM-a1i9ba_1r8UAMJRQv_kBu8XUzes_5PtRdEClQ,37620
|
69
|
+
modal/sandbox.pyi,sha256=xmXcfh24MAAneJFU_AEH-eaHfGRWET0LtjQeFr6Qcgs,38513
|
70
70
|
modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
|
71
71
|
modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
|
72
72
|
modal/secret.py,sha256=bpgtv0urwaBOmmJpMTZIwVWUraQlpeu4hW8pbJiGcOA,10546
|
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
|
|
78
78
|
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
79
79
|
modal/token_flow.py,sha256=0_4KabXKsuE4OXTJ1OuLOtA-b1sesShztMZkkRFK7tA,7605
|
80
80
|
modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
|
81
|
-
modal/volume.py,sha256=
|
82
|
-
modal/volume.pyi,sha256=
|
81
|
+
modal/volume.py,sha256=aIGp_ZFD6UUqM2XnS19GBqWLc1_xOVBIx2JcFn30aYk,44475
|
82
|
+
modal/volume.pyi,sha256=Qo5D0Bojcp8J4t4OoRArrBFaC1MSvFf9jQIL9U6Qz2Q,40779
|
83
83
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
84
84
|
modal/_runtime/asgi.py,sha256=_2xSTsDD27Cit7xnMs4lzkJA2wzer2_N4Oa3BkXFzVA,22521
|
85
85
|
modal/_runtime/container_io_manager.py,sha256=hjkK4gke_A8_mULSfm3F1hZKR0C61lKbRUI8mHS-LGE,45464
|
@@ -97,7 +97,7 @@ modal/_utils/blob_utils.py,sha256=v2NAQVVGx1AQjHQ7-2T64x5rYtwjFFykxDXb-0grrzA,21
|
|
97
97
|
modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
|
98
98
|
modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
|
99
99
|
modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
|
100
|
-
modal/_utils/function_utils.py,sha256=
|
100
|
+
modal/_utils/function_utils.py,sha256=mFdEKMAgMC_1jgnH9_-0N0DgIlrIlKO6bBeseWbM3TE,27026
|
101
101
|
modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
|
102
102
|
modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
|
103
103
|
modal/_utils/grpc_utils.py,sha256=HBZdMcBHCk6uozILYTjGnR0mV8fg7WOdJldoyZ-ZhSg,10137
|
@@ -151,7 +151,7 @@ modal/requirements/2025.06.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqr
|
|
151
151
|
modal/requirements/PREVIEW.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqrs,312
|
152
152
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
153
153
|
modal/requirements/base-images.json,sha256=JYSDAgHTl-WrV_TZW5icY-IJEnbe2eQ4CZ_KN6EOZKU,1304
|
154
|
-
modal-1.0.6.
|
154
|
+
modal-1.0.6.dev61.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
155
155
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
156
156
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
157
157
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -174,10 +174,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
174
174
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
175
175
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
176
176
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
177
|
-
modal_version/__init__.py,sha256=
|
177
|
+
modal_version/__init__.py,sha256=YE4any51Y4tqwNuA5XgXJh6SIIK3WHXj4AdH_DEGMb0,121
|
178
178
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
179
|
-
modal-1.0.6.
|
180
|
-
modal-1.0.6.
|
181
|
-
modal-1.0.6.
|
182
|
-
modal-1.0.6.
|
183
|
-
modal-1.0.6.
|
179
|
+
modal-1.0.6.dev61.dist-info/METADATA,sha256=YHPQDR5AI60UQZnbQRf2yNsUYo8cPDew3IeX4BmYFVQ,2462
|
180
|
+
modal-1.0.6.dev61.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
181
|
+
modal-1.0.6.dev61.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
182
|
+
modal-1.0.6.dev61.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
183
|
+
modal-1.0.6.dev61.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|