modal 1.0.3.dev27__py3-none-any.whl → 1.0.4.dev1__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/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.3.dev27",
34
+ version: str = "1.0.4.dev1",
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.3.dev27",
97
+ version: str = "1.0.4.dev1",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
modal/mount.py CHANGED
@@ -290,6 +290,7 @@ class _Mount(_Object, type_prefix="mo"):
290
290
  _deployment_name: Optional[str] = None
291
291
  _namespace: Optional[int] = None
292
292
  _environment_name: Optional[str] = None
293
+ _allow_overwrite: bool = False
293
294
  _content_checksum_sha256_hex: Optional[str] = None
294
295
 
295
296
  @staticmethod
@@ -600,11 +601,16 @@ class _Mount(_Object, type_prefix="mo"):
600
601
  # Build the mount.
601
602
  status_row.message(f"Creating mount {message_label}: Finalizing index of {len(files)} files")
602
603
  if self._deployment_name:
604
+ creation_type = (
605
+ api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING
606
+ if self._allow_overwrite
607
+ else api_pb2.OBJECT_CREATION_TYPE_CREATE_FAIL_IF_EXISTS
608
+ )
603
609
  req = api_pb2.MountGetOrCreateRequest(
604
610
  deployment_name=self._deployment_name,
605
611
  namespace=self._namespace,
606
612
  environment_name=self._environment_name,
607
- object_creation_type=api_pb2.OBJECT_CREATION_TYPE_CREATE_FAIL_IF_EXISTS,
613
+ object_creation_type=creation_type,
608
614
  files=files,
609
615
  )
610
616
  elif resolver.app_id is not None:
@@ -736,7 +742,9 @@ class _Mount(_Object, type_prefix="mo"):
736
742
  self: "_Mount",
737
743
  deployment_name: Optional[str] = None,
738
744
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
745
+ *,
739
746
  environment_name: Optional[str] = None,
747
+ allow_overwrite: bool = False,
740
748
  client: Optional[_Client] = None,
741
749
  ) -> None:
742
750
  check_object_name(deployment_name, "Mount")
@@ -744,6 +752,7 @@ class _Mount(_Object, type_prefix="mo"):
744
752
  self._deployment_name = deployment_name
745
753
  self._namespace = namespace
746
754
  self._environment_name = environment_name
755
+ self._allow_overwrite = allow_overwrite
747
756
  if client is None:
748
757
  client = await _Client.from_env()
749
758
  resolver = Resolver(client=client, environment_name=environment_name)
@@ -826,35 +835,34 @@ import sys; sys.path.append('{REMOTE_PACKAGES_PATH}')
826
835
  """.strip()
827
836
 
828
837
 
829
- async def _create_single_mount(
838
+ async def _create_single_client_dependency_mount(
830
839
  client: _Client,
831
840
  builder_version: str,
832
841
  python_version: str,
833
- platform: str,
834
842
  arch: str,
835
- uv_python_platform: str = None,
843
+ platform: str,
844
+ uv_python_platform: str,
836
845
  check_if_exists: bool = True,
846
+ allow_overwrite: bool = False,
837
847
  ):
838
- import subprocess
839
848
  import tempfile
840
849
 
841
850
  profile_environment = config.get("environment")
842
851
  abi_tag = "cp" + python_version.replace(".", "")
843
852
  mount_name = f"{builder_version}-{abi_tag}-{platform}-{arch}"
844
- uv_python_platform = uv_python_platform or f"{arch}-{platform}"
845
853
 
846
854
  if check_if_exists:
847
855
  try:
848
856
  await Mount.from_name(mount_name, namespace=api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL).hydrate.aio(client)
849
- print(f" Found existing mount {mount_name} in global namespace.")
857
+ print(f" Found existing mount {mount_name} in global namespace.")
850
858
  return
851
859
  except modal.exception.NotFoundError:
852
860
  pass
853
861
 
854
- with tempfile.TemporaryDirectory() as tmpd:
862
+ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpd:
855
863
  print(f"📦 Building {mount_name}.")
856
864
  requirements = os.path.join(os.path.dirname(__file__), f"requirements/{builder_version}.txt")
857
- subprocess.run(
865
+ cmd = " ".join(
858
866
  [
859
867
  "uv",
860
868
  "pip",
@@ -871,12 +879,21 @@ async def _create_single_mount(
871
879
  uv_python_platform,
872
880
  "--python-version",
873
881
  python_version,
874
- ],
875
- check=True,
876
- capture_output=True,
882
+ ]
877
883
  )
884
+ proc = await asyncio.create_subprocess_shell(
885
+ cmd,
886
+ stdout=asyncio.subprocess.PIPE,
887
+ stderr=asyncio.subprocess.PIPE,
888
+ )
889
+ await proc.wait()
890
+ if proc.returncode:
891
+ stdout, stderr = await proc.communicate()
892
+ print(stdout.decode("utf-8"))
893
+ print(stderr.decode("utf-8"))
894
+ raise RuntimeError(f"Subprocess failed with {proc.returncode}", proc.args)
878
895
 
879
- print(f"🌐 Downloaded and unpacked packages to {tmpd}.")
896
+ print(f"🌐 Downloaded and unpacked {mount_name} packages to {tmpd}.")
880
897
 
881
898
  python_mount = Mount._from_local_dir(tmpd, remote_path=REMOTE_PACKAGES_PATH)
882
899
 
@@ -895,6 +912,7 @@ async def _create_single_mount(
895
912
  mount_name,
896
913
  api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL,
897
914
  environment_name=profile_environment,
915
+ allow_overwrite=allow_overwrite,
898
916
  client=client,
899
917
  )
900
918
  print(f"✅ Deployed mount {mount_name} to global namespace.")
@@ -902,34 +920,30 @@ async def _create_single_mount(
902
920
 
903
921
  async def _create_client_dependency_mounts(
904
922
  client=None,
905
- check_if_exists=True,
906
923
  python_versions: list[str] = list(PYTHON_STANDALONE_VERSIONS),
924
+ check_if_exists=True,
907
925
  ):
926
+ arch = "x86_64"
927
+ platform_tags = [
928
+ ("manylinux_2_17", f"{arch}-manylinux_2_17"), # glibc >= 2.17
929
+ ("musllinux_1_2", f"{arch}-unknown-linux-musl"), # musl >= 1.2
930
+ ]
908
931
  coros = []
909
- for python_version in python_versions:
910
- # glibc >= 2.17
911
- coros.append(
912
- _create_single_mount(
913
- client,
914
- "PREVIEW",
915
- python_version,
916
- "manylinux_2_17",
917
- "x86_64",
918
- check_if_exists=check_if_exists,
919
- )
920
- )
921
- # musl >= 1.2
922
- coros.append(
923
- _create_single_mount(
924
- client,
925
- "PREVIEW",
926
- python_version,
927
- "musllinux_1_2",
928
- "x86_64",
929
- uv_python_platform="x86_64-unknown-linux-musl",
930
- check_if_exists=check_if_exists,
931
- )
932
- )
932
+ for builder_version in ["PREVIEW"]:
933
+ for python_version in python_versions:
934
+ for platform, uv_python_platform in platform_tags:
935
+ coros.append(
936
+ _create_single_client_dependency_mount(
937
+ client,
938
+ builder_version,
939
+ python_version,
940
+ arch,
941
+ platform,
942
+ uv_python_platform,
943
+ check_if_exists=builder_version != "PREVIEW",
944
+ allow_overwrite=builder_version == "PREVIEW",
945
+ )
946
+ )
933
947
  await TaskContext.gather(*coros)
934
948
 
935
949
 
modal/mount.pyi CHANGED
@@ -82,6 +82,7 @@ class _Mount(modal._object._Object):
82
82
  _deployment_name: typing.Optional[str]
83
83
  _namespace: typing.Optional[int]
84
84
  _environment_name: typing.Optional[str]
85
+ _allow_overwrite: bool
85
86
  _content_checksum_sha256_hex: typing.Optional[str]
86
87
 
87
88
  @staticmethod
@@ -172,7 +173,9 @@ class _Mount(modal._object._Object):
172
173
  self: _Mount,
173
174
  deployment_name: typing.Optional[str] = None,
174
175
  namespace=1,
176
+ *,
175
177
  environment_name: typing.Optional[str] = None,
178
+ allow_overwrite: bool = False,
176
179
  client: typing.Optional[modal.client._Client] = None,
177
180
  ) -> None: ...
178
181
  def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata: ...
@@ -184,6 +187,7 @@ class Mount(modal.object.Object):
184
187
  _deployment_name: typing.Optional[str]
185
188
  _namespace: typing.Optional[int]
186
189
  _environment_name: typing.Optional[str]
190
+ _allow_overwrite: bool
187
191
  _content_checksum_sha256_hex: typing.Optional[str]
188
192
 
189
193
  def __init__(self, *args, **kwargs): ...
@@ -288,7 +292,9 @@ class Mount(modal.object.Object):
288
292
  /,
289
293
  deployment_name: typing.Optional[str] = None,
290
294
  namespace=1,
295
+ *,
291
296
  environment_name: typing.Optional[str] = None,
297
+ allow_overwrite: bool = False,
292
298
  client: typing.Optional[modal.client.Client] = None,
293
299
  ) -> None: ...
294
300
  async def aio(
@@ -296,7 +302,9 @@ class Mount(modal.object.Object):
296
302
  /,
297
303
  deployment_name: typing.Optional[str] = None,
298
304
  namespace=1,
305
+ *,
299
306
  environment_name: typing.Optional[str] = None,
307
+ allow_overwrite: bool = False,
300
308
  client: typing.Optional[modal.client.Client] = None,
301
309
  ) -> None: ...
302
310
 
@@ -308,25 +316,26 @@ def _create_client_mount(): ...
308
316
  def create_client_mount(): ...
309
317
  def _get_client_mount(): ...
310
318
  def _is_modal_path(remote_path: pathlib.PurePosixPath): ...
311
- async def _create_single_mount(
319
+ async def _create_single_client_dependency_mount(
312
320
  client: modal.client._Client,
313
321
  builder_version: str,
314
322
  python_version: str,
315
- platform: str,
316
323
  arch: str,
317
- uv_python_platform: str = None,
324
+ platform: str,
325
+ uv_python_platform: str,
318
326
  check_if_exists: bool = True,
327
+ allow_overwrite: bool = False,
319
328
  ): ...
320
329
  async def _create_client_dependency_mounts(
321
- client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
330
+ client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
322
331
  ): ...
323
332
 
324
333
  class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
325
334
  def __call__(
326
- self, /, client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
335
+ self, /, client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
327
336
  ): ...
328
337
  async def aio(
329
- self, /, client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
338
+ self, /, client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
330
339
  ): ...
331
340
 
332
341
  create_client_dependency_mounts: __create_client_dependency_mounts_spec
@@ -1,16 +1,17 @@
1
- aiohappyeyeballs==2.4.3
2
- aiohttp==3.10.8
3
- aiosignal==1.3.1
4
- async-timeout==4.0.3 ; python_version < "3.11"
5
- attrs==24.2.0
6
- certifi==2024.8.30
7
- frozenlist==1.4.1
8
- grpclib==0.4.7
9
- h2==4.1.0
10
- hpack==4.0.0
11
- hyperframe==6.0.1
1
+ aiohappyeyeballs==2.6.1
2
+ aiohttp==3.12.7
3
+ aiosignal==1.3.2
4
+ async-timeout==5.0.1 ; python_version < "3.11"
5
+ attrs==25.3.0
6
+ certifi==2025.4.26
7
+ frozenlist==1.6.0
8
+ grpclib==0.4.8
9
+ h2==4.2.0
10
+ hpack==4.1.0
11
+ hyperframe==6.1.0
12
12
  idna==3.10
13
- multidict==6.1.0
14
- protobuf>=3.20,<6
15
- typing_extensions==4.12.2
16
- yarl==1.13.1
13
+ multidict==6.4.4
14
+ propcache==0.3.1
15
+ protobuf==6.31.1
16
+ typing_extensions==4.13.2
17
+ yarl==1.20.0
@@ -6,13 +6,35 @@
6
6
  "2023.12": "bullseye"
7
7
  },
8
8
  "python": {
9
- "PREVIEW": ["3.9.20", "3.10.15", "3.11.10", "3.12.6", "3.13.0"],
10
- "2024.10": ["3.9.20", "3.10.15", "3.11.10", "3.12.6", "3.13.0"],
11
- "2024.04": ["3.9.19", "3.10.14", "3.11.8", "3.12.2"],
12
- "2023.12": ["3.9.15", "3.10.8", "3.11.0", "3.12.1"]
9
+ "PREVIEW": [
10
+ "3.9.22",
11
+ "3.10.17",
12
+ "3.11.12",
13
+ "3.12.10",
14
+ "3.13.3"
15
+ ],
16
+ "2024.10": [
17
+ "3.9.20",
18
+ "3.10.15",
19
+ "3.11.10",
20
+ "3.12.6",
21
+ "3.13.0"
22
+ ],
23
+ "2024.04": [
24
+ "3.9.19",
25
+ "3.10.14",
26
+ "3.11.8",
27
+ "3.12.2"
28
+ ],
29
+ "2023.12": [
30
+ "3.9.15",
31
+ "3.10.8",
32
+ "3.11.0",
33
+ "3.12.1"
34
+ ]
13
35
  },
14
36
  "micromamba": {
15
- "PREVIEW": "1.5.10",
37
+ "PREVIEW": "2.1.1",
16
38
  "2024.10": "1.5.10",
17
39
  "2024.04": "1.5.8",
18
40
  "2023.12": "1.3.1"
@@ -23,4 +45,4 @@
23
45
  "2024.04": "pip wheel uv",
24
46
  "2023.12": "pip"
25
47
  }
26
- }
48
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev27
3
+ Version: 1.0.4.dev1
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ Requires-Dist: click~=8.1.0
22
22
  Requires-Dist: grpclib==0.4.7
23
23
  Requires-Dist: protobuf!=4.24.0,<7.0,>=3.19
24
24
  Requires-Dist: rich>=12.0.0
25
- Requires-Dist: synchronicity~=0.9.12
25
+ Requires-Dist: synchronicity~=0.9.13
26
26
  Requires-Dist: toml
27
27
  Requires-Dist: typer>=0.9
28
28
  Requires-Dist: types-certifi
@@ -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=1GPfWYDBPCm6S9mgPue1-ZgAnApI1I1qMQcGkhH53dE,8459
25
+ modal/client.pyi,sha256=QmMY2s9nEVq0UDPl7T0Ka3lXRUF6SnTuwxhhuVr7a7I,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
@@ -45,8 +45,8 @@ modal/image.py,sha256=yrI9DCw7GAck3d788GCHJom-_yU55zNu7reNapBhlgE,93284
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
48
- modal/mount.py,sha256=HbSN-45SWLB7MvIeGcBDKa5nP0Z3wFyKIRX-B37Epw4,34637
49
- modal/mount.pyi,sha256=h4yzzppRKvD3JuTTjm9hE2Ye_aUKueTV09F5I_Regjg,13364
48
+ modal/mount.py,sha256=7gdzBNueSjPsgsdisMv1bv5SncEQyWc6D-YlAbpze3s,35523
49
+ modal/mount.pyi,sha256=xuJ3vaz33I9Mk8jxQPjlOxX5NC4WT5rqiazX3faS59U,13630
50
50
  modal/network_file_system.py,sha256=lgtmHYjzA5gDMx0tysH0-WJB2Ao9JD2W15NyYK2A7_w,14612
51
51
  modal/network_file_system.pyi,sha256=58DiUqHGlARmI3cz-Yo7IFObKKFIiGh5UIU5JxGNFfc,8333
52
52
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
@@ -144,10 +144,10 @@ modal/requirements/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u
144
144
  modal/requirements/2023.12.txt,sha256=OjsbXFkCSdkzzryZP82Q73osr5wxQ6EUzmGcK7twfkA,502
145
145
  modal/requirements/2024.04.txt,sha256=6NnrbIE-mflwMyKyQ0tsWeY8XFE1kSW9oE8DVDoD8QU,544
146
146
  modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
147
- modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
147
+ modal/requirements/PREVIEW.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqrs,312
148
148
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
149
- modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
150
- modal-1.0.3.dev27.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
+ modal/requirements/base-images.json,sha256=f1bwyp2UkM844eoO9Qk30gQw_xrMqKpMSeJ6MErXnEk,995
150
+ modal-1.0.4.dev1.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
@@ -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=eirvDB9Mszj-uky9aXge_PlFZb6oYhExcj5KYivAi_c,121
173
+ modal_version/__init__.py,sha256=ugbAu8MZi9Ew6_OSeu_o0OPHmWAknh5qPaLz7vzKj3w,120
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal-1.0.3.dev27.dist-info/METADATA,sha256=pF-z-vH6sWixfB-QK9R3bhOfUpaspS76-MU6tf8hnbA,2455
176
- modal-1.0.3.dev27.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.3.dev27.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.3.dev27.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.3.dev27.dist-info/RECORD,,
175
+ modal-1.0.4.dev1.dist-info/METADATA,sha256=U5vZN_UC5HnuCBHeIwmPFj4bWVCX4QsPMP9Cn_Q7YUY,2454
176
+ modal-1.0.4.dev1.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
+ modal-1.0.4.dev1.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-1.0.4.dev1.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
+ modal-1.0.4.dev1.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.0.3.dev27"
4
+ __version__ = "1.0.4.dev1"