modal 1.0.2.dev3__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/_utils/bytes_io_segment_payload.py +6 -2
- modal/client.pyi +2 -2
- modal/image.py +38 -16
- modal/volume.py +13 -8
- modal/volume.pyi +2 -2
- {modal-1.0.2.dev3.dist-info → modal-1.0.2.dev6.dist-info}/METADATA +1 -1
- {modal-1.0.2.dev3.dist-info → modal-1.0.2.dev6.dist-info}/RECORD +16 -16
- 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.dev3.dist-info → modal-1.0.2.dev6.dist-info}/WHEEL +0 -0
- {modal-1.0.2.dev3.dist-info → modal-1.0.2.dev6.dist-info}/entry_points.txt +0 -0
- {modal-1.0.2.dev3.dist-info → modal-1.0.2.dev6.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.2.dev3.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,
|
@@ -52,12 +52,16 @@ class BytesIOSegmentPayload(BytesIOPayload):
|
|
52
52
|
self._value.seek(self.initial_seek_pos)
|
53
53
|
|
54
54
|
@contextmanager
|
55
|
-
def reset_on_error(self):
|
55
|
+
def reset_on_error(self, subtract_progress: bool = False):
|
56
56
|
try:
|
57
57
|
yield
|
58
58
|
except Exception as exc:
|
59
59
|
try:
|
60
|
-
|
60
|
+
if subtract_progress:
|
61
|
+
negative_progress = -self.num_bytes_read
|
62
|
+
self.progress_report_cb(advance=negative_progress)
|
63
|
+
else:
|
64
|
+
self.progress_report_cb(reset=True)
|
61
65
|
except Exception as cb_exc:
|
62
66
|
raise cb_exc from exc
|
63
67
|
raise exc
|
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/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
|
modal/volume.py
CHANGED
@@ -38,6 +38,7 @@ from ._utils.async_utils import (
|
|
38
38
|
async_map,
|
39
39
|
async_map_ordered,
|
40
40
|
asyncnullcontext,
|
41
|
+
retry,
|
41
42
|
synchronize_api,
|
42
43
|
)
|
43
44
|
from ._utils.blob_utils import (
|
@@ -835,7 +836,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
|
|
835
836
|
progress_cb: Optional[Callable[..., Any]] = None,
|
836
837
|
force: bool = False,
|
837
838
|
hash_concurrency: int = multiprocessing.cpu_count(),
|
838
|
-
put_concurrency: int =
|
839
|
+
put_concurrency: int = 128,
|
839
840
|
):
|
840
841
|
"""mdmd:hidden"""
|
841
842
|
self._volume_id = volume_id
|
@@ -1020,6 +1021,16 @@ async def _put_missing_blocks(
|
|
1020
1021
|
file_progress.pending_blocks.add(missing_block.block_index)
|
1021
1022
|
task_progress_cb = functools.partial(progress_cb, task_id=file_progress.task_id)
|
1022
1023
|
|
1024
|
+
@retry(n_attempts=5, base_delay=0.5, timeout=None)
|
1025
|
+
async def put_missing_block_attempt(payload: BytesIOSegmentPayload) -> bytes:
|
1026
|
+
with payload.reset_on_error(subtract_progress=True):
|
1027
|
+
async with ClientSessionRegistry.get_session().put(
|
1028
|
+
missing_block.put_url,
|
1029
|
+
data=payload,
|
1030
|
+
) as response:
|
1031
|
+
response.raise_for_status()
|
1032
|
+
return await response.content.read()
|
1033
|
+
|
1023
1034
|
async with put_semaphore:
|
1024
1035
|
with file_spec.source() as source_fp:
|
1025
1036
|
payload = BytesIOSegmentPayload(
|
@@ -1030,13 +1041,7 @@ async def _put_missing_blocks(
|
|
1030
1041
|
chunk_size=256 * 1024,
|
1031
1042
|
progress_report_cb=task_progress_cb,
|
1032
1043
|
)
|
1033
|
-
|
1034
|
-
async with ClientSessionRegistry.get_session().put(
|
1035
|
-
missing_block.put_url,
|
1036
|
-
data=payload,
|
1037
|
-
) as response:
|
1038
|
-
response.raise_for_status()
|
1039
|
-
resp_data = await response.content.read()
|
1044
|
+
resp_data = await put_missing_block_attempt(payload)
|
1040
1045
|
|
1041
1046
|
file_progress.pending_blocks.remove(missing_block.block_index)
|
1042
1047
|
|
modal/volume.pyi
CHANGED
@@ -494,7 +494,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
|
|
494
494
|
progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
|
495
495
|
force: bool = False,
|
496
496
|
hash_concurrency: int = 4,
|
497
|
-
put_concurrency: int =
|
497
|
+
put_concurrency: int = 128,
|
498
498
|
): ...
|
499
499
|
async def __aenter__(self): ...
|
500
500
|
async def __aexit__(self, exc_type, exc_val, exc_tb): ...
|
@@ -534,7 +534,7 @@ class VolumeUploadContextManager2(AbstractVolumeUploadContextManager):
|
|
534
534
|
progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
|
535
535
|
force: bool = False,
|
536
536
|
hash_concurrency: int = 4,
|
537
|
-
put_concurrency: int =
|
537
|
+
put_concurrency: int = 128,
|
538
538
|
): ...
|
539
539
|
def __enter__(self): ...
|
540
540
|
async def __aenter__(self): ...
|
@@ -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
|
@@ -41,7 +41,7 @@ modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw
|
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
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
|
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=dIEBdTPb7O3VwkQ8TMPjfyU17RLuS9i0DnACxxHy8X4,676
|
|
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=ILbRv6JsZq-jK8jcJM7eB74e0PsbzwBm7hyPcV9lBlQ,2121
|
81
|
-
modal/volume.py,sha256=
|
82
|
-
modal/volume.pyi,sha256=
|
81
|
+
modal/volume.py,sha256=LO8hYt2y0BOXsWzjMUUfOhSxBs7eILgTP5Lvi0IRjxM,44092
|
82
|
+
modal/volume.pyi,sha256=fM1RRKz521eIzM3Cd7osAhQ3UQEboQEjXWLQKerjSzY,21117
|
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=6j0jO2-s9ShckM4SK45OapoQxWW9HQwQjFaBkXPJPwU,44763
|
@@ -93,7 +93,7 @@ modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
|
93
93
|
modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
|
94
94
|
modal/_utils/async_utils.py,sha256=zjdtdA54zvNL_RuREmN5NWFhhiRcNh8z0jT2rBc5RgY,28001
|
95
95
|
modal/_utils/blob_utils.py,sha256=IexC2Jbtqp_Tkmy62ayfgzTYte0UPCNufB_v-DO21g8,18585
|
96
|
-
modal/_utils/bytes_io_segment_payload.py,sha256=
|
96
|
+
modal/_utils/bytes_io_segment_payload.py,sha256=DT4roLCafjexASGyM1lPOR0HlwOYLA9UQqlxzTgUttE,3614
|
97
97
|
modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
|
98
98
|
modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
|
99
99
|
modal/_utils/function_utils.py,sha256=bhrjyOHPPXm6fAyJx3bzI1Yh56j6xh8eeMSFKdAWrHQ,26978
|
@@ -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 {
|