modal 1.0.2.dev4__py3-none-any.whl → 1.0.2.dev6__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 +6 -0
- modal/client.pyi +2 -2
- modal/functions.pyi +6 -6
- modal/image.py +38 -16
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/METADATA +1 -1
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/RECORD +14 -14
- modal_proto/api.proto +3 -0
- modal_proto/api_pb2.py +374 -374
- modal_proto/api_pb2.pyi +16 -3
- modal_version/__init__.py +1 -1
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/WHEEL +0 -0
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/entry_points.txt +0 -0
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.2.dev4.dist-info → modal-1.0.2.dev6.dist-info}/top_level.txt +0 -0
modal/_functions.py
CHANGED
@@ -815,6 +815,11 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
815
815
|
if app and app.name:
|
816
816
|
app_name = app.name
|
817
817
|
|
818
|
+
# on builder > 2024.10 we mount client dependencies at runtime
|
819
|
+
mount_client_dependencies = False
|
820
|
+
if image._metadata is not None:
|
821
|
+
mount_client_dependencies = image._metadata.image_builder_version > "2024.10"
|
822
|
+
|
818
823
|
# Relies on dicts being ordered (true as of Python 3.6).
|
819
824
|
volume_mounts = [
|
820
825
|
api_pb2.VolumeMount(
|
@@ -884,6 +889,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
884
889
|
schedule=schedule.proto_message if schedule is not None else None,
|
885
890
|
snapshot_debug=config.get("snapshot_debug"),
|
886
891
|
experimental_options=experimental_options or {},
|
892
|
+
mount_client_dependencies=mount_client_dependencies,
|
887
893
|
# ---
|
888
894
|
_experimental_group_size=cluster_size or 0, # Experimental: Clustered functions
|
889
895
|
_experimental_concurrent_cancellations=True,
|
modal/client.pyi
CHANGED
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "1.0.2.
|
34
|
+
version: str = "1.0.2.dev6",
|
35
35
|
): ...
|
36
36
|
def is_closed(self) -> bool: ...
|
37
37
|
@property
|
@@ -94,7 +94,7 @@ class Client:
|
|
94
94
|
server_url: str,
|
95
95
|
client_type: int,
|
96
96
|
credentials: typing.Optional[tuple[str, str]],
|
97
|
-
version: str = "1.0.2.
|
97
|
+
version: str = "1.0.2.dev6",
|
98
98
|
): ...
|
99
99
|
def is_closed(self) -> bool: ...
|
100
100
|
@property
|
modal/functions.pyi
CHANGED
@@ -227,11 +227,11 @@ class Function(
|
|
227
227
|
|
228
228
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
229
229
|
|
230
|
-
class __remote_spec(typing_extensions.Protocol[
|
230
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
231
231
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
232
232
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
233
233
|
|
234
|
-
remote: __remote_spec[modal._functions.
|
234
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
235
235
|
|
236
236
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
237
237
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -246,12 +246,12 @@ class Function(
|
|
246
246
|
self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
|
247
247
|
) -> modal._functions.OriginalReturnType: ...
|
248
248
|
|
249
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
249
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
250
250
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
251
251
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
252
252
|
|
253
253
|
_experimental_spawn: ___experimental_spawn_spec[
|
254
|
-
modal._functions.
|
254
|
+
modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
|
255
255
|
]
|
256
256
|
|
257
257
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
@@ -260,11 +260,11 @@ class Function(
|
|
260
260
|
|
261
261
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
262
262
|
|
263
|
-
class __spawn_spec(typing_extensions.Protocol[
|
263
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
264
264
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
265
265
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
266
266
|
|
267
|
-
spawn: __spawn_spec[modal._functions.
|
267
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
268
268
|
|
269
269
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
|
270
270
|
|
modal/image.py
CHANGED
@@ -1442,7 +1442,9 @@ class _Image(_Object, type_prefix="im"):
|
|
1442
1442
|
if version > "2024.10":
|
1443
1443
|
# for convenience when launching in a sandbox: sleep for 48h
|
1444
1444
|
commands.append(f'CMD ["sleep", "{48 * 3600}"]')
|
1445
|
-
context_files = {
|
1445
|
+
context_files = {}
|
1446
|
+
if version <= "2024.10":
|
1447
|
+
context_files = {CONTAINER_REQUIREMENTS_PATH: _get_modal_requirements_path(version, python_version)}
|
1446
1448
|
return DockerfileSpec(commands=commands, context_files=context_files)
|
1447
1449
|
|
1448
1450
|
return _Image._from_args(
|
@@ -1517,12 +1519,15 @@ class _Image(_Object, type_prefix="im"):
|
|
1517
1519
|
|
1518
1520
|
# Note: this change is because we install dependencies with uv in 2024.10+
|
1519
1521
|
requirements_prefix = "python -m " if builder_version < "2024.10" else ""
|
1520
|
-
modal_requirements_commands = [
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1522
|
+
modal_requirements_commands = []
|
1523
|
+
if builder_version <= "2024.10":
|
1524
|
+
# past 2024.10, client dependencies are mounted at runtime
|
1525
|
+
modal_requirements_commands.extend([
|
1526
|
+
f"COPY {CONTAINER_REQUIREMENTS_PATH} {CONTAINER_REQUIREMENTS_PATH}",
|
1527
|
+
f"RUN python -m pip install --upgrade {_base_image_config('package_tools', builder_version)}",
|
1528
|
+
f"RUN {requirements_prefix}{_get_modal_requirements_command(builder_version)}",
|
1529
|
+
])
|
1530
|
+
if "2024.10" >= builder_version > "2023.12":
|
1526
1531
|
modal_requirements_commands.append(f"RUN rm {CONTAINER_REQUIREMENTS_PATH}")
|
1527
1532
|
|
1528
1533
|
return [
|
@@ -1585,7 +1590,9 @@ class _Image(_Object, type_prefix="im"):
|
|
1585
1590
|
|
1586
1591
|
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
1587
1592
|
commands = _Image._registry_setup_commands(tag, version, setup_dockerfile_commands, add_python)
|
1588
|
-
context_files = {
|
1593
|
+
context_files = {}
|
1594
|
+
if version <= "2024.10":
|
1595
|
+
context_files = {CONTAINER_REQUIREMENTS_PATH: _get_modal_requirements_path(version, add_python)}
|
1589
1596
|
return DockerfileSpec(commands=commands, context_files=context_files)
|
1590
1597
|
|
1591
1598
|
return _Image._from_args(
|
@@ -1792,8 +1799,10 @@ class _Image(_Object, type_prefix="im"):
|
|
1792
1799
|
|
1793
1800
|
def build_dockerfile_python(version: ImageBuilderVersion) -> DockerfileSpec:
|
1794
1801
|
commands = _Image._registry_setup_commands("base", version, [], add_python)
|
1795
|
-
|
1796
|
-
|
1802
|
+
context_files = {}
|
1803
|
+
if version <= "2024.10":
|
1804
|
+
requirements_path = _get_modal_requirements_path(version, add_python)
|
1805
|
+
context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
|
1797
1806
|
return DockerfileSpec(commands=commands, context_files=context_files)
|
1798
1807
|
|
1799
1808
|
return _Image._from_args(
|
@@ -1810,22 +1819,35 @@ class _Image(_Object, type_prefix="im"):
|
|
1810
1819
|
raise TypeError("The `python_version` argument should be a string, not a float.")
|
1811
1820
|
|
1812
1821
|
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
1813
|
-
|
1814
|
-
|
1822
|
+
context_files = {}
|
1823
|
+
if version <= "2024.10":
|
1824
|
+
requirements_path = _get_modal_requirements_path(version, python_version)
|
1825
|
+
context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
|
1815
1826
|
full_python_version = _dockerhub_python_version(version, python_version)
|
1816
1827
|
debian_codename = _base_image_config("debian", version)
|
1817
1828
|
|
1818
1829
|
commands = [
|
1819
1830
|
f"FROM python:{full_python_version}-slim-{debian_codename}",
|
1820
|
-
|
1831
|
+
]
|
1832
|
+
if version <= "2024.10":
|
1833
|
+
commands.extend([
|
1834
|
+
f"COPY {CONTAINER_REQUIREMENTS_PATH} {CONTAINER_REQUIREMENTS_PATH}",
|
1835
|
+
])
|
1836
|
+
commands.extend([
|
1821
1837
|
"RUN apt-get update",
|
1822
1838
|
"RUN apt-get install -y gcc gfortran build-essential",
|
1823
1839
|
f"RUN pip install --upgrade {_base_image_config('package_tools', version)}",
|
1824
|
-
|
1840
|
+
])
|
1841
|
+
if version <= "2024.10":
|
1842
|
+
# after 2024.10, modal requirements are mounted at runtime
|
1843
|
+
commands.extend([
|
1844
|
+
f"RUN {_get_modal_requirements_command(version)}",
|
1845
|
+
])
|
1846
|
+
commands.extend([
|
1825
1847
|
# Set debian front-end to non-interactive to avoid users getting stuck with input prompts.
|
1826
1848
|
"RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections",
|
1827
|
-
]
|
1828
|
-
if version > "2023.12":
|
1849
|
+
])
|
1850
|
+
if "2024.10" >= version > "2023.12":
|
1829
1851
|
commands.append(f"RUN rm {CONTAINER_REQUIREMENTS_PATH}")
|
1830
1852
|
if version > "2024.10":
|
1831
1853
|
# for convenience when launching in a sandbox: sleep for 48h
|
@@ -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=2aWxN2v5WUnj-R-sk6BzJ-3AvggkQGQjwhtvbDH3pds,777
|
5
5
|
modal/_container_entrypoint.py,sha256=2Zx9O_EMJg0H77EdnC2vGKs6uFMWwbP1NLFf-qYmWmU,28962
|
6
|
-
modal/_functions.py,sha256=
|
6
|
+
modal/_functions.py,sha256=f8MhqxCzqBSUfrR_5uo60p1UHwNmPi_oEdZKDkFv2yw,78874
|
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=KzzzZoM41UQUiY9TKOrft9BtZKgjWG_ukdlyLGjB4UY,10758
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=NZ_rJ9TuMfiNiLg8-gOFgufD5flGtXWPHOZI0gdD3hE,46585
|
|
22
22
|
modal/app.pyi,sha256=4-b_vbe3lNAqQPcMRpQCEDsE1zsVkQRJGUql9B7HvbM,22659
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=OwISJvkgMb-rHm9Gc4i-7YcDgGiZgwJ7F_PzwZH7a6Q,16847
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=rMdZuJBm7bAjYzrLfGDgMIHxtL-ZWDTuZHDIBErYBlI,8457
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
28
28
|
modal/cls.py,sha256=dBbeARwOWftlKd1cwtM0cHFtQWSWkwVXwVmOV4w0SyI,37907
|
@@ -39,9 +39,9 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
|
39
39
|
modal/file_io.pyi,sha256=oB7x-rKq7bmm8cA7Z7W9C9yeko7KK9m9i5GidFnkGK4,9569
|
40
40
|
modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw,6516
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
|
-
modal/functions.pyi,sha256=
|
42
|
+
modal/functions.pyi,sha256=iqdp5ixtOOlm8bF-QYbD_G8VKqSRt_AVLT7AWjpn6pQ,16236
|
43
43
|
modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
|
44
|
-
modal/image.py,sha256
|
44
|
+
modal/image.py,sha256=-ia4ELkIh4sxOSqdYETAPV8EEb58Nue6DLdAxhM2C_Y,92687
|
45
45
|
modal/image.pyi,sha256=2xjB6XOZDtm_chDdd90UoIj8pnDt5hCg6bOmu5fNaA4,25625
|
46
46
|
modal/io_streams.py,sha256=YDZVQSDv05DeXg5TwcucC9Rj5hQBx2GXdluan9rIUpw,15467
|
47
47
|
modal/io_streams.pyi,sha256=1UK6kWLREASQfq-wL9wSp5iqjLU0egRZPDn4LXs1PZY,5136
|
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
147
147
|
modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
148
148
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
149
149
|
modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
|
150
|
-
modal-1.0.2.
|
150
|
+
modal-1.0.2.dev6.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
151
151
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
152
152
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
153
153
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -155,10 +155,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
|
|
155
155
|
modal_docs/mdmd/mdmd.py,sha256=Irx49MCCTlBOP4FBdLR--JrpA3-WhsVeriq0LGgsRic,6232
|
156
156
|
modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
|
157
157
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
158
|
-
modal_proto/api.proto,sha256=
|
158
|
+
modal_proto/api.proto,sha256=TZU4O7rl6_3p0kPhwtCFpUzF2ev7nogfT_dJia1q0YA,95957
|
159
159
|
modal_proto/api_grpc.py,sha256=iY5o_Tm4VDP-Wa1JgA_NpQa_Y-4FYB_RN9wdSUExjwI,117469
|
160
|
-
modal_proto/api_pb2.py,sha256=
|
161
|
-
modal_proto/api_pb2.pyi,sha256=
|
160
|
+
modal_proto/api_pb2.py,sha256=05O5ZucslpXNOq5JMbC8HkqYl4YNJt_h6fqHQuK9yXw,338105
|
161
|
+
modal_proto/api_pb2.pyi,sha256=u-YdDR8e6cjSSID-wRuCUeOiEZuhVP9XNY_pTlrC820,462457
|
162
162
|
modal_proto/api_pb2_grpc.py,sha256=NL5prOS_hh_pA1hVvQP_ZRE1w49N-PR8iNPRZ65i6nA,254089
|
163
163
|
modal_proto/api_pb2_grpc.pyi,sha256=Xxgdcnv1mBnu5_AQxJ6fo0yz7GnqVU0HVObNfZWHVfM,59440
|
164
164
|
modal_proto/modal_api_grpc.py,sha256=0ir2lnwT3-IgPcAWw98yWMAiqZPkjvNro9UBk4u8hnk,17763
|
@@ -170,10 +170,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
170
170
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
171
171
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
172
172
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
173
|
-
modal_version/__init__.py,sha256=
|
173
|
+
modal_version/__init__.py,sha256=qcIJkO4GPARwJtX7zhvOkc6WEfDHBd7zpWLt_Pfqkoc,120
|
174
174
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
175
|
-
modal-1.0.2.
|
176
|
-
modal-1.0.2.
|
177
|
-
modal-1.0.2.
|
178
|
-
modal-1.0.2.
|
179
|
-
modal-1.0.2.
|
175
|
+
modal-1.0.2.dev6.dist-info/METADATA,sha256=fGqT8MVdu4KeSk1RwbZaQLNc2VTSo1bV8rzPdR3wHAc,2454
|
176
|
+
modal-1.0.2.dev6.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
177
|
+
modal-1.0.2.dev6.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
178
|
+
modal-1.0.2.dev6.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
179
|
+
modal-1.0.2.dev6.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
@@ -2153,6 +2153,7 @@ message PTYInfo {
|
|
2153
2153
|
message PortSpec {
|
2154
2154
|
uint32 port = 1;
|
2155
2155
|
bool unencrypted = 2;
|
2156
|
+
optional string tunnel_type = 3;
|
2156
2157
|
}
|
2157
2158
|
|
2158
2159
|
message PortSpecs {
|
@@ -2586,6 +2587,7 @@ message SandboxWaitResponse {
|
|
2586
2587
|
message Schedule {
|
2587
2588
|
message Cron {
|
2588
2589
|
string cron_string = 1;
|
2590
|
+
string timezone = 2;
|
2589
2591
|
}
|
2590
2592
|
message Period {
|
2591
2593
|
int32 years = 1;
|
@@ -2876,6 +2878,7 @@ message TunnelData {
|
|
2876
2878
|
message TunnelStartRequest {
|
2877
2879
|
uint32 port = 1;
|
2878
2880
|
bool unencrypted = 2;
|
2881
|
+
optional string tunnel_type = 3;
|
2879
2882
|
}
|
2880
2883
|
|
2881
2884
|
message TunnelStartResponse {
|