modAL 1.2.2.dev28__py3-none-any.whl → 1.2.2.dev30__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/_grpc_client.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Copyright Modal Labs 2025
2
- from typing import TYPE_CHECKING, Any, Collection, Generic, Literal, Mapping, Optional, TypeVar, Union
2
+ from typing import TYPE_CHECKING, Any, Collection, Generic, Literal, Mapping, Optional, TypeVar, Union, overload
3
3
 
4
4
  import grpclib.client
5
5
  from google.protobuf.message import Message
@@ -47,6 +47,9 @@ class grpc_error_converter:
47
47
  return False
48
48
 
49
49
 
50
+ _DEFAULT_RETRY = Retry()
51
+
52
+
50
53
  class UnaryUnaryWrapper(Generic[RequestType, ResponseType]):
51
54
  # Calls a grpclib.UnaryUnaryMethod using a specific Client instance, respecting
52
55
  # if that client is closed etc. and possibly introducing Modal-specific retry logic
@@ -67,11 +70,31 @@ class UnaryUnaryWrapper(Generic[RequestType, ResponseType]):
67
70
  def name(self) -> str:
68
71
  return self.wrapped_method.name
69
72
 
73
+ @overload
74
+ async def __call__(
75
+ self,
76
+ req: RequestType,
77
+ *,
78
+ retry: Retry = _DEFAULT_RETRY,
79
+ timeout: None = None,
80
+ metadata: Optional[list[tuple[str, str]]] = None,
81
+ ) -> ResponseType: ...
82
+
83
+ @overload
84
+ async def __call__(
85
+ self,
86
+ req: RequestType,
87
+ *,
88
+ retry: None,
89
+ timeout: Optional[float] = None,
90
+ metadata: Optional[list[tuple[str, str]]] = None,
91
+ ) -> ResponseType: ...
92
+
70
93
  async def __call__(
71
94
  self,
72
95
  req: RequestType,
73
96
  *,
74
- retry: Optional[Retry] = Retry(),
97
+ retry: Optional[Retry] = _DEFAULT_RETRY,
75
98
  timeout: Optional[float] = None,
76
99
  metadata: Optional[list[tuple[str, str]]] = None,
77
100
  ) -> ResponseType:
@@ -645,14 +645,13 @@ class FunctionCreationStatus:
645
645
  if not self.response:
646
646
  self.status_row.finish(f"Unknown error when creating function {self.tag}")
647
647
 
648
- elif self.response.function.web_url:
648
+ elif web_url := self.response.handle_metadata.web_url:
649
649
  url_info = self.response.function.web_url_info
650
650
  requires_proxy_auth = self.response.function.webhook_config.requires_proxy_auth
651
651
  proxy_auth_suffix = " 🔑" if requires_proxy_auth else ""
652
652
  # Ensure terms used here match terms used in modal.com/docs/guide/webhook-urls doc.
653
653
  suffix = _get_suffix_from_web_url_info(url_info)
654
654
  # TODO: this is only printed when we're showing progress. Maybe move this somewhere else.
655
- web_url = self.response.handle_metadata.web_url
656
655
  for warning in self.response.server_warnings:
657
656
  self.status_row.warning(warning)
658
657
  self.status_row.finish(
modal/client.pyi CHANGED
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.2.2.dev28",
36
+ version: str = "1.2.2.dev30",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.2.2.dev28",
167
+ version: str = "1.2.2.dev30",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
modal/image.py CHANGED
@@ -886,8 +886,8 @@ class _Image(_Object, type_prefix="im"):
886
886
  ```python
887
887
  image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
888
888
 
889
- app = modal.App("build-image")
890
- with modal.enable_output(), app.run():
889
+ app = modal.App.lookup("build-image", create_if_missing=True)
890
+ with modal.enable_output(): # To see logs in your local terminal
891
891
  image.build(app)
892
892
 
893
893
  # Save the image id
@@ -900,7 +900,7 @@ class _Image(_Object, type_prefix="im"):
900
900
  Alternatively, you can pre-build a image and use it in a sandbox.
901
901
 
902
902
  ```python notest
903
- app = modal.App.lookup("sandbox-example")
903
+ app = modal.App.lookup("sandbox-example", create_if_missing=True)
904
904
 
905
905
  with modal.enable_output():
906
906
  image = modal.Image.debian_slim().uv_pip_install("scipy")
modal/image.pyi CHANGED
@@ -330,8 +330,8 @@ class _Image(modal._object._Object):
330
330
  ```python
331
331
  image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
332
332
 
333
- app = modal.App("build-image")
334
- with modal.enable_output(), app.run():
333
+ app = modal.App.lookup("build-image", create_if_missing=True)
334
+ with modal.enable_output(): # To see logs in your local terminal
335
335
  image.build(app)
336
336
 
337
337
  # Save the image id
@@ -344,7 +344,7 @@ class _Image(modal._object._Object):
344
344
  Alternatively, you can pre-build a image and use it in a sandbox.
345
345
 
346
346
  ```python notest
347
- app = modal.App.lookup("sandbox-example")
347
+ app = modal.App.lookup("sandbox-example", create_if_missing=True)
348
348
 
349
349
  with modal.enable_output():
350
350
  image = modal.Image.debian_slim().uv_pip_install("scipy")
@@ -1257,8 +1257,8 @@ class Image(modal.object.Object):
1257
1257
  ```python
1258
1258
  image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1259
1259
 
1260
- app = modal.App("build-image")
1261
- with modal.enable_output(), app.run():
1260
+ app = modal.App.lookup("build-image", create_if_missing=True)
1261
+ with modal.enable_output(): # To see logs in your local terminal
1262
1262
  image.build(app)
1263
1263
 
1264
1264
  # Save the image id
@@ -1271,7 +1271,7 @@ class Image(modal.object.Object):
1271
1271
  Alternatively, you can pre-build a image and use it in a sandbox.
1272
1272
 
1273
1273
  ```python notest
1274
- app = modal.App.lookup("sandbox-example")
1274
+ app = modal.App.lookup("sandbox-example", create_if_missing=True)
1275
1275
 
1276
1276
  with modal.enable_output():
1277
1277
  image = modal.Image.debian_slim().uv_pip_install("scipy")
@@ -1310,8 +1310,8 @@ class Image(modal.object.Object):
1310
1310
  ```python
1311
1311
  image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1312
1312
 
1313
- app = modal.App("build-image")
1314
- with modal.enable_output(), app.run():
1313
+ app = modal.App.lookup("build-image", create_if_missing=True)
1314
+ with modal.enable_output(): # To see logs in your local terminal
1315
1315
  image.build(app)
1316
1316
 
1317
1317
  # Save the image id
@@ -1324,7 +1324,7 @@ class Image(modal.object.Object):
1324
1324
  Alternatively, you can pre-build a image and use it in a sandbox.
1325
1325
 
1326
1326
  ```python notest
1327
- app = modal.App.lookup("sandbox-example")
1327
+ app = modal.App.lookup("sandbox-example", create_if_missing=True)
1328
1328
 
1329
1329
  with modal.enable_output():
1330
1330
  image = modal.Image.debian_slim().uv_pip_install("scipy")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.2.dev28
3
+ Version: 1.2.2.dev30
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -5,7 +5,7 @@ modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA
5
5
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
6
  modal/_container_entrypoint.py,sha256=zYk5mC8_IMx4kWnyFMRHKOrFRLBWchy6x-py3M8FYEw,28084
7
7
  modal/_functions.py,sha256=QCEm1_6l0WSGlF4ICyH580wd8VyFinQRybQVxUXESuM,90416
8
- modal/_grpc_client.py,sha256=xnrubCsqK8JlbVMLI3_iHuDLmV2rNZjEAQeCDAZl-eE,5558
8
+ modal/_grpc_client.py,sha256=KZcggVNvFL5jRQkFumshMppeFHMbaZI9Dzf13run6As,6083
9
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
10
10
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
11
11
  modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
@@ -25,7 +25,7 @@ modal/app.pyi,sha256=AUV5Rp8qQrZJTP2waoKHFY7rYgsXNMYibMcCAQKuSeo,50544
25
25
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
26
26
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
27
27
  modal/client.py,sha256=tPzihC7R9WtP56k6dyPKi5GLGdLEHdMA6YUj9Ry5G8o,14409
28
- modal/client.pyi,sha256=GR-MV_KNPkValt5rjMzUgKGmSqdlpFxQ0Z61OttoZAY,13094
28
+ modal/client.pyi,sha256=wqhlqlBI75mdVJFrcfKk0gQ1qbKmFeXwiIvRC7hTEJo,13094
29
29
  modal/cloud_bucket_mount.py,sha256=Ff8UFG_Z0HUzcRAAfo1jvDwzaNgiX_btTFOHL7CGyI8,6016
30
30
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
31
31
  modal/cls.py,sha256=1kxGkqXgAJS6anuWKdbqWx_n0rbXqyFuYJIROeBxNyw,40306
@@ -44,8 +44,8 @@ modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE
44
44
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
45
45
  modal/functions.pyi,sha256=Z6VuukLrjASAgf0kV9I6c09WvP_b2gCujX6f9j2bBaw,37988
46
46
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
47
- modal/image.py,sha256=SW2QJNZCXpPwLwK5UAjRJexWr1-pUJR6AJJ5OCF7rQI,108048
48
- modal/image.pyi,sha256=NQ82YbSF_kadH0r4UqBDgHPDHZo5_yD8qNEFJgUzJZM,77956
47
+ modal/image.py,sha256=Pm2nONagz9HfeZyyK4KWvTzDTKx9QRlumpFhzhuHW90,108130
48
+ modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
49
49
  modal/io_streams.py,sha256=Lc-id7HvW-ffJKSoN1xQxf37pHARNkr4re2HKyGpKy4,29316
50
50
  modal/io_streams.pyi,sha256=P9kvQhXmh9fxQNGI2DtuFnnZ_9MJQ4ZiqOpDP2-QWUU,16746
51
51
  modal/mount.py,sha256=UPel5L2JfeOgI96718SSrjJ0dhMOQgnFDJrzpzsZ4A8,33111
@@ -100,7 +100,7 @@ modal/_utils/blob_utils.py,sha256=NoAWDqYQsqAjievWmH5mCFSXA6XxQStDt9otT-Nh7_g,22
100
100
  modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
101
101
  modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
102
102
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
103
- modal/_utils/function_utils.py,sha256=B5dAhcOM6SK3H-iwbrJjZ7XbjpweFd3YfmuFS26R8fQ,28671
103
+ modal/_utils/function_utils.py,sha256=wL2AA8aEftxCBATPStHgKDRPxrFjPAv-rHt0Wb7y9Ts,28629
104
104
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
105
105
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
106
106
  modal/_utils/grpc_utils.py,sha256=9KOQ3JW6DEmsi0lqve0YkTMU23u9AmWIyvLWJVA3TKc,11515
@@ -157,7 +157,7 @@ modal/experimental/__init__.py,sha256=sCwNbBLcR2t-jhrpwtMAPGKt2WNqXBg0xkNZdyB-6C
157
157
  modal/experimental/flash.py,sha256=RKS3X3h4tY_mOLcMzbRs5tNCLPFL01dBAhCZSqCeBgA,26675
158
158
  modal/experimental/flash.pyi,sha256=uwinKAYxpunNNfBj58FP88DXb535Qik4F6tnJKPAIwQ,14696
159
159
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
160
- modal-1.2.2.dev28.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
160
+ modal-1.2.2.dev30.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
161
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
162
162
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
163
163
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -185,10 +185,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
185
185
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
186
186
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
187
187
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
188
- modal_version/__init__.py,sha256=qQ5ipwhxQJu3FCb517mmFYVNbgysExrcs1wDKLhfbg0,121
188
+ modal_version/__init__.py,sha256=zvuna815ilJagWL3Xg8huaAv_l72NGA63ECILONhr5I,121
189
189
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
190
- modal-1.2.2.dev28.dist-info/METADATA,sha256=5b3ZmlwT8vPY993lV1EJ38GmQ1dH_6ha6vz2n1h-nJs,2490
191
- modal-1.2.2.dev28.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
192
- modal-1.2.2.dev28.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
193
- modal-1.2.2.dev28.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
194
- modal-1.2.2.dev28.dist-info/RECORD,,
190
+ modal-1.2.2.dev30.dist-info/METADATA,sha256=omF9tdS7xacsGah8jgkumnAt2loWlqZ_2eoT9eYFajo,2490
191
+ modal-1.2.2.dev30.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
192
+ modal-1.2.2.dev30.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
193
+ modal-1.2.2.dev30.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
194
+ modal-1.2.2.dev30.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.2.2.dev28"
4
+ __version__ = "1.2.2.dev30"