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 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.dev4",
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.dev4",
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[ReturnType_INNER, P_INNER, SUPERSELF]):
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.ReturnType, modal._functions.P, typing_extensions.Self]
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[ReturnType_INNER, P_INNER, SUPERSELF]):
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.ReturnType, modal._functions.P, typing_extensions.Self
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[ReturnType_INNER, P_INNER, SUPERSELF]):
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.ReturnType, modal._functions.P, typing_extensions.Self]
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 = {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.2.dev4
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=VuX_UQXWpe-33b-1nZiBVuPcV7mXtDqAZbi7pw13CD0,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
@@ -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=5T58OucdNU4I-LqhBdwsWSAGka-Wa8nP2GcZ5K1bOL0,16236
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
@@ -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.dev4.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=Fa79PSoRVo9x2enS4U-X0x0iNewxTVKIJ8xYL0ZPric,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.dev4.dist-info/METADATA,sha256=HyPUSIJptfUIOb_WQB0Bf1JTB0g0q7xgI717Vfm4qe0,2454
176
- modal-1.0.2.dev4.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.2.dev4.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.2.dev4.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.2.dev4.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 {