modal 0.75.0__py3-none-any.whl → 0.75.1__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

modal/_functions.py CHANGED
@@ -336,6 +336,67 @@ class _Invocation:
336
336
  break
337
337
 
338
338
 
339
+ class _InputPlaneInvocation:
340
+ """Internal client representation of a single-input call to a Modal Function using the input
341
+ plane server API. As of 4/22/2025, this class is experimental and not used in production.
342
+ It is OK to make breaking changes to this class."""
343
+
344
+ stub: ModalClientModal
345
+
346
+ def __init__(
347
+ self,
348
+ stub: ModalClientModal,
349
+ attempt_token: str,
350
+ client: _Client,
351
+ ):
352
+ self.stub = stub
353
+ self.client = client # Used by the deserializer.
354
+ self.attempt_token = attempt_token
355
+
356
+ @staticmethod
357
+ async def create(
358
+ function: "_Function",
359
+ args,
360
+ kwargs,
361
+ *,
362
+ client: _Client,
363
+ input_plane_url: str,
364
+ ) -> "_InputPlaneInvocation":
365
+ stub = await client.get_stub(input_plane_url)
366
+
367
+ function_id = function.object_id
368
+ item = await _create_input(args, kwargs, stub, method_name=function._use_method_name)
369
+
370
+ request = api_pb2.AttemptStartRequest(
371
+ function_id=function_id,
372
+ parent_input_id=current_input_id() or "",
373
+ input=item,
374
+ )
375
+ response = await retry_transient_errors(stub.AttemptStart, request)
376
+ attempt_token = response.attempt_token
377
+
378
+ return _InputPlaneInvocation(stub, attempt_token, client)
379
+
380
+ async def run_function(self) -> Any:
381
+ # TODO(nathan): add retry logic
382
+ while True:
383
+ request = api_pb2.AttemptAwaitRequest(
384
+ attempt_token=self.attempt_token,
385
+ timeout_secs=OUTPUTS_TIMEOUT,
386
+ requested_at=time.time(),
387
+ )
388
+ response: api_pb2.AttemptAwaitResponse = await retry_transient_errors(
389
+ self.stub.AttemptAwait,
390
+ request,
391
+ attempt_timeout=OUTPUTS_TIMEOUT + ATTEMPT_TIMEOUT_GRACE_PERIOD,
392
+ )
393
+
394
+ if response.HasField("output"):
395
+ return await _process_result(
396
+ response.output.result, response.output.data_format, self.stub, self.client
397
+ )
398
+
399
+
339
400
  # Wrapper type for api_pb2.FunctionStats
340
401
  @dataclass(frozen=True)
341
402
  class FunctionStats:
@@ -1323,6 +1384,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1323
1384
  self._class_parameter_info = metadata.class_parameter_info
1324
1385
  self._method_handle_metadata = dict(metadata.method_handle_metadata)
1325
1386
  self._definition_id = metadata.definition_id
1387
+ self._input_plane_url = metadata.input_plane_url
1326
1388
 
1327
1389
  def _get_metadata(self):
1328
1390
  # Overridden concrete implementation of base class method
@@ -1337,6 +1399,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1337
1399
  definition_id=self._definition_id,
1338
1400
  method_handle_metadata=self._method_handle_metadata,
1339
1401
  function_schema=self._metadata.function_schema if self._metadata else None,
1402
+ input_plane_url=self._input_plane_url
1340
1403
  )
1341
1404
 
1342
1405
  def _check_no_web_url(self, fn_name: str):
@@ -1418,13 +1481,23 @@ Use the `Function.get_web_url()` method instead.
1418
1481
  yield item
1419
1482
 
1420
1483
  async def _call_function(self, args, kwargs) -> ReturnType:
1421
- invocation = await _Invocation.create(
1422
- self,
1423
- args,
1424
- kwargs,
1425
- client=self.client,
1426
- function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_SYNC,
1427
- )
1484
+ invocation: Union[_Invocation, _InputPlaneInvocation]
1485
+ if self._input_plane_url:
1486
+ invocation = await _InputPlaneInvocation.create(
1487
+ self,
1488
+ args,
1489
+ kwargs,
1490
+ client=self.client,
1491
+ input_plane_url=self._input_plane_url,
1492
+ )
1493
+ else:
1494
+ invocation = await _Invocation.create(
1495
+ self,
1496
+ args,
1497
+ kwargs,
1498
+ client=self.client,
1499
+ function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_SYNC,
1500
+ )
1428
1501
 
1429
1502
  return await invocation.run_function()
1430
1503
 
modal/client.pyi CHANGED
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.0"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.1"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -86,7 +86,7 @@ class Client:
86
86
  _snapshotted: bool
87
87
 
88
88
  def __init__(
89
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.0"
89
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.1"
90
90
  ): ...
91
91
  def is_closed(self) -> bool: ...
92
92
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.75.0
3
+ Version: 0.75.1
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=_P4Q8rTwqT9HjNK1mWLd2JhKW4L6wGfA2L6fNLdvDcA,77984
6
+ modal/_functions.py,sha256=7Cec6Q7_ND6Ejlwn0c6Y2OufOmsg6huWqeRTZY6faYM,80527
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=6ve4sI2nRAnjPCuAXdSoUplaXfzC9MqRlF_ZLULwwy0,11472
@@ -22,7 +22,7 @@ modal/app.py,sha256=xojuGZv4LaQwZU5ntj7WbmMjeNuB9Gll8Mzqe2LyiEs,51323
22
22
  modal/app.pyi,sha256=zNwR1_2LpmQc9AhemuAeVdk90XNYDw9keOkXAwAATeA,28732
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=o-aQThHpvDHUzg_kUafyhWzACViUBhY2WLZ2EitnSHA,16787
25
- modal/client.pyi,sha256=QGV7hw7cbSUPf1-YNfmQQAtWbVbURz63LiSfAJmtmo8,8383
25
+ modal/client.pyi,sha256=pPWEh6maNF0V7pvpLnCRw60B_aUEpB8Au_EhJsW9C3M,8383
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=aHoMEWMZUN7bOezs3tRPxzS1FP3gTxZBORVjbPmtxyg,35338
@@ -146,7 +146,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
146
146
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
147
147
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
148
148
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
149
- modal-0.75.0.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
+ modal-0.75.1.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
150
150
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
151
151
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
152
152
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -171,9 +171,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
171
171
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  modal_version/__init__.py,sha256=PenIvZdwt-HVdbetAyxuPoyZTtzx2moKZoJLK8iZ804,470
173
173
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
174
- modal_version/_version_generated.py,sha256=xY42837vKm61-ALQSXUsQL7xa7Mzr89C_jy3PIOBieM,148
175
- modal-0.75.0.dist-info/METADATA,sha256=IlDnARAwFMkBlKAeUTt_EeJW09lyPi9G1Dt7FreFuY4,2450
176
- modal-0.75.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-0.75.0.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-0.75.0.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-0.75.0.dist-info/RECORD,,
174
+ modal_version/_version_generated.py,sha256=_nDSI8hGHxzdQjG0q_a6V1UkzG2U0-lDGnd-alp1KWU,148
175
+ modal-0.75.1.dist-info/METADATA,sha256=rI8s9zk_8oi-zEgq1ErtRePjGukBN2ino__FTqWzJ1E,2450
176
+ modal-0.75.1.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
+ modal-0.75.1.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-0.75.1.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
+ modal-0.75.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 0 # git: 0f7fb1e
4
+ build_number = 1 # git: 0f5c526
File without changes