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 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
- self.progress_report_cb(reset=True)
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.dev3",
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.dev3",
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 = {CONTAINER_REQUIREMENTS_PATH: _get_modal_requirements_path(version, python_version)}
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
- f"COPY {CONTAINER_REQUIREMENTS_PATH} {CONTAINER_REQUIREMENTS_PATH}",
1522
- f"RUN python -m pip install --upgrade {_base_image_config('package_tools', builder_version)}",
1523
- f"RUN {requirements_prefix}{_get_modal_requirements_command(builder_version)}",
1524
- ]
1525
- if builder_version > "2023.12":
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 = {CONTAINER_REQUIREMENTS_PATH: _get_modal_requirements_path(version, add_python)}
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
- requirements_path = _get_modal_requirements_path(version, add_python)
1796
- context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
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
- requirements_path = _get_modal_requirements_path(version, python_version)
1814
- context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
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
- f"COPY {CONTAINER_REQUIREMENTS_PATH} {CONTAINER_REQUIREMENTS_PATH}",
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
- f"RUN {_get_modal_requirements_command(version)}",
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 = multiprocessing.cpu_count(),
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 = 4,
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 = 4,
537
+ put_concurrency: int = 128,
538
538
  ): ...
539
539
  def __enter__(self): ...
540
540
  async def __aenter__(self): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.2.dev3
3
+ Version: 1.0.2.dev6
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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=iL1ZVzgLr9xP1UF0rpiazSavdC6DNqnkDU38eaTbk9I,78525
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=xTs9E_DF56Sp0Km3zj2oiJUyHET7_nrStxf7Yc-p4Kk,8457
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=bGs4FF9TofGQOy2RRjedD2MTyIsmF-9Gdk-I7BitMRw,91832
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=6pFezqaHyDO8vbnOe9YnqS8O3_UFaSsaD-0TtLp7Y48,43831
82
- modal/volume.pyi,sha256=9hPIMRBzGZycVL8uRfGpjSmNu_pCbkGAOyrnE86bU2Y,21113
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=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
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.dev3.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
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=Qp0gpXAw0H8X8oPrU2Aa-_kewoI53-bUf0LWe_DO4hM,95862
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=Jvq4X0FG5xQaiNVr7XlOZQWfmm_9b2JmN8LNT2hJJdU,337902
161
- modal_proto/api_pb2.pyi,sha256=KNcKpRgynsi3y6bVGen_y6FrHnXXUMOyREqbJExqb6Y,461341
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=JoN5GDEaJvDfGXoicnt-DLtRVBTLL3no1OmYdLXiJlE,120
173
+ modal_version/__init__.py,sha256=qcIJkO4GPARwJtX7zhvOkc6WEfDHBd7zpWLt_Pfqkoc,120
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal-1.0.2.dev3.dist-info/METADATA,sha256=x_sw8sYaaXKnZKRUhUvqVypCmye43Ai1TrfM1i4guh0,2454
176
- modal-1.0.2.dev3.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.2.dev3.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.2.dev3.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.2.dev3.dist-info/RECORD,,
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 {