modal 1.0.5.dev23__py3-none-any.whl → 1.0.5.dev26__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
@@ -141,7 +141,13 @@ class _Invocation:
141
141
  stub = client.stub
142
142
 
143
143
  function_id = function.object_id
144
- item = await _create_input(args, kwargs, stub, method_name=function._use_method_name)
144
+ item = await _create_input(
145
+ args,
146
+ kwargs,
147
+ stub,
148
+ method_name=function._use_method_name,
149
+ function_call_invocation_type=function_call_invocation_type,
150
+ )
145
151
 
146
152
  request = api_pb2.FunctionMapRequest(
147
153
  function_id=function_id,
@@ -38,6 +38,9 @@ if TYPE_CHECKING:
38
38
  # Max size for function inputs and outputs.
39
39
  MAX_OBJECT_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB
40
40
 
41
+ # Max size for async function inputs and outputs.
42
+ MAX_ASYNC_OBJECT_SIZE_BYTES = 8 * 1024 # 8 KiB
43
+
41
44
  # If a file is LARGE_FILE_LIMIT bytes or larger, it's uploaded to blob store (s3) instead of going through grpc
42
45
  # It will also make sure to chunk the hash calculation to avoid reading the entire file into memory
43
46
  LARGE_FILE_LIMIT = 4 * 1024 * 1024 # 4 MiB
@@ -32,7 +32,7 @@ from ..exception import (
32
32
  RemoteError,
33
33
  )
34
34
  from ..mount import ROOT_DIR, _is_modal_path, _Mount
35
- from .blob_utils import MAX_OBJECT_SIZE_BYTES, blob_download, blob_upload
35
+ from .blob_utils import MAX_ASYNC_OBJECT_SIZE_BYTES, MAX_OBJECT_SIZE_BYTES, blob_download, blob_upload
36
36
  from .grpc_utils import RETRYABLE_GRPC_STATUS_CODES
37
37
 
38
38
 
@@ -511,8 +511,27 @@ async def _process_result(result: api_pb2.GenericResult, data_format: int, stub,
511
511
  ) from deser_exc
512
512
 
513
513
 
514
+ def should_upload(
515
+ num_bytes: int,
516
+ function_call_invocation_type: Optional["api_pb2.FunctionCallInvocationType.ValueType"],
517
+ ) -> bool:
518
+ """
519
+ Determine if the input should be uploaded to blob storage.
520
+ """
521
+ return num_bytes > MAX_OBJECT_SIZE_BYTES or (
522
+ function_call_invocation_type == api_pb2.FUNCTION_CALL_INVOCATION_TYPE_ASYNC
523
+ and num_bytes > MAX_ASYNC_OBJECT_SIZE_BYTES
524
+ )
525
+
526
+
514
527
  async def _create_input(
515
- args, kwargs, stub: ModalClientModal, *, idx: Optional[int] = None, method_name: Optional[str] = None
528
+ args,
529
+ kwargs,
530
+ stub: ModalClientModal,
531
+ *,
532
+ idx: Optional[int] = None,
533
+ method_name: Optional[str] = None,
534
+ function_call_invocation_type: Optional["api_pb2.FunctionCallInvocationType.ValueType"] = None,
516
535
  ) -> api_pb2.FunctionPutInputsItem:
517
536
  """Serialize function arguments and create a FunctionInput protobuf,
518
537
  uploading to blob storage if needed.
@@ -524,9 +543,8 @@ async def _create_input(
524
543
 
525
544
  args_serialized = serialize((args, kwargs))
526
545
 
527
- if len(args_serialized) > MAX_OBJECT_SIZE_BYTES:
546
+ if should_upload(len(args_serialized), function_call_invocation_type):
528
547
  args_blob_id = await blob_upload(args_serialized, stub)
529
-
530
548
  return api_pb2.FunctionPutInputsItem(
531
549
  input=api_pb2.FunctionInput(
532
550
  args_blob_id=args_blob_id,
modal/app.py CHANGED
@@ -731,7 +731,7 @@ class _App:
731
731
  dedent(
732
732
  """
733
733
  The `@app.function` decorator must apply to functions in global scope,
734
- unless `serialize=True` is set.
734
+ unless `serialized=True` is set.
735
735
  If trying to apply additional decorators, they may need to use `functools.wraps`.
736
736
  """
737
737
  )
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.5.dev23",
34
+ version: str = "1.0.5.dev26",
35
35
  ):
36
36
  """mdmd:hidden
37
37
  The Modal client object is not intended to be instantiated directly by users.
@@ -160,7 +160,7 @@ class Client:
160
160
  server_url: str,
161
161
  client_type: int,
162
162
  credentials: typing.Optional[tuple[str, str]],
163
- version: str = "1.0.5.dev23",
163
+ version: str = "1.0.5.dev26",
164
164
  ):
165
165
  """mdmd:hidden
166
166
  The Modal client object is not intended to be instantiated directly by users.
modal/functions.pyi CHANGED
@@ -428,7 +428,7 @@ class Function(
428
428
 
429
429
  _call_generator: ___call_generator_spec[typing_extensions.Self]
430
430
 
431
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
431
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
432
432
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
433
433
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
434
434
  ...
@@ -437,7 +437,7 @@ class Function(
437
437
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
438
438
  ...
439
439
 
440
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
440
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
441
441
 
442
442
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
443
443
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -464,7 +464,7 @@ class Function(
464
464
  """
465
465
  ...
466
466
 
467
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
467
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
468
468
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
469
469
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
470
470
 
@@ -488,7 +488,7 @@ class Function(
488
488
  ...
489
489
 
490
490
  _experimental_spawn: ___experimental_spawn_spec[
491
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
491
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
492
492
  ]
493
493
 
494
494
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -497,7 +497,7 @@ class Function(
497
497
 
498
498
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
499
499
 
500
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
500
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
501
501
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
502
502
  """Calls the function with the given arguments, without waiting for the results.
503
503
 
@@ -518,7 +518,7 @@ class Function(
518
518
  """
519
519
  ...
520
520
 
521
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
521
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
522
522
 
523
523
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
524
524
  """Return the inner Python object wrapped by this Modal Function."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.5.dev23
3
+ Version: 1.0.5.dev26
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=_QKM87tdYwcALSGth8a0-9qXl02fZK6zMfEGEoYz7eA,1007
5
5
  modal/_container_entrypoint.py,sha256=2Zx9O_EMJg0H77EdnC2vGKs6uFMWwbP1NLFf-qYmWmU,28962
6
- modal/_functions.py,sha256=Fgavqqqp0P-ZAKk0-3tO3cUaGX5xgq8kXRQ3kSWpaFc,80665
6
+ modal/_functions.py,sha256=YNbv0z5VhQN_gunrkzwkRsM7LUod52cv1AP5tq91W7g,80797
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
@@ -18,11 +18,11 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
18
18
  modal/_tunnel.pyi,sha256=rvC7USR2BcKkbZIeCJXwf7-UfGE-LPLjKsGNiK7Lxa4,13366
19
19
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
20
20
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
21
- modal/app.py,sha256=pj-4mpvBR6phFG38rQZ8GM1FIgcaM8cje5d_Vo2_gJU,46602
21
+ modal/app.py,sha256=fCKq3TJ2Y5LB2WKNs6pp_5XECNH5avUL01jQljuoYRU,46603
22
22
  modal/app.pyi,sha256=Z6wi_dkXywiaM2rvAvguj2Wgu9ZgPjMSLl1nH1a7EYI,42243
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=32iWa_uq3S0I0X49laR4i6n7WyPBpaCnB2jikccCapU,15081
25
+ modal/client.pyi,sha256=b53lXhDL_NPYF4CJXKY8QfRffRy5vQF-Po6HKzl1NEM,15081
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=s5UhFqNQz34aYOpmMTnlgQMhI7GfN3IkCLNlGXrrW7M,39795
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=SCBfLk5gRieqdTVlA_f-2YHHtRp7Iy_sA6iR1zPsO3c,21100
39
39
  modal/file_io.pyi,sha256=_Hm-59MrppfuBYxtzdJkA2Jf9zI5LlbPh_0gURk0_7s,15222
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=C-vcR7DNCeqb4gIQiooocX_PhgvlvJ8ef4Wt4kqcu_c,34819
42
+ modal/functions.pyi,sha256=XQqNwbrcppGO-2ytKcndDIuWjT5R55pd6t99HDCT140,34819
43
43
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
44
44
  modal/image.py,sha256=HAFqGvur6IsWp-7fKDJUU1_KzTwBMt6FDmwQCskxCi4,93301
45
45
  modal/image.pyi,sha256=RX6R-n1SwmNkJXi7L-BuRcfIU_zZH89kw-L7RWjiGic,67344
@@ -92,11 +92,11 @@ modal/_runtime/user_code_imports.py,sha256=78wJyleqY2RVibqcpbDQyfWVBVT9BjyHPeoV9
92
92
  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=MhSCsCL8GqIVFWoHubU_899IH-JBZAiiqadG9Wri2l4,29361
95
- modal/_utils/blob_utils.py,sha256=JsldGQBg-UDa0wij_KxYgaxGRNo1vmKEntofiL5nIUI,19739
95
+ modal/_utils/blob_utils.py,sha256=ItaXkYVlrOF4iqwhAsUelYqj-bd132bdZCvqdHK0ceo,19838
96
96
  modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
97
97
  modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
98
98
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
99
- modal/_utils/function_utils.py,sha256=QS8cRE0zGerlCW-r5457HXNj5uQM_4SGs7AbQLAtbwA,27319
99
+ modal/_utils/function_utils.py,sha256=7rFHglocBOUEmbZDEwgVAA2pnhq-7JHcpppQmgAZLoQ,27907
100
100
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
101
101
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
102
102
  modal/_utils/grpc_utils.py,sha256=aFDJIK3Idn9r0iqLRmQqCKsPhRCueyeaA64mZUvDNKA,11118
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
147
147
  modal/requirements/PREVIEW.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqrs,312
148
148
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
149
149
  modal/requirements/base-images.json,sha256=f1bwyp2UkM844eoO9Qk30gQw_xrMqKpMSeJ6MErXnEk,995
150
- modal-1.0.5.dev23.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
150
+ modal-1.0.5.dev26.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=HQSwSvH8kTumsLeNEEkyDQpFa7vMnvLPP-qRyKMEW-M,97424
158
+ modal_proto/api.proto,sha256=agC8IZJ6VoaB9zJhdIJDBY_JbNaE7w3ai7R5YgM9oMw,97549
159
159
  modal_proto/api_grpc.py,sha256=KR3X2FZiKjJuistRWzsBsDi8DKeIlKJJ2iPPbzltDJg,119140
160
- modal_proto/api_pb2.py,sha256=gK6H1bncUrb_F1o1gSgSQFGZGaHWTfxscxuVZhf8a88,342599
161
- modal_proto/api_pb2.pyi,sha256=NtXJpSEdait0BXnx6o4OpJa91gu3C2_pn1SaKDLcZns,469483
160
+ modal_proto/api_pb2.py,sha256=c0TjsVp0gG1uwDGrJfgkjNzWKNbQXZCMLHeNhiYakv0,343370
161
+ modal_proto/api_pb2.pyi,sha256=LzY2IUSl7mxI5n_xOyYExWIyCIyfAz0jSrM0sw9RDas,470373
162
162
  modal_proto/api_pb2_grpc.py,sha256=xRO6E7F9wSeE75T2NW_EVSN0JHUkCz-qQDgPMTG1x0o,257566
163
163
  modal_proto/api_pb2_grpc.pyi,sha256=pCgIpIcJnEoWnh1Bu1LT62-oesNHN-XyQJaZzxRNeB4,60334
164
164
  modal_proto/modal_api_grpc.py,sha256=Vc2BoHcB6hV2GlkwvpB5yBfeJT72dxQ6-VMUhbPD-0U,18019
@@ -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=xw3MVaRg3zyZmcNCet7RxDckJPJCNmYMmecn8maSv0I,121
173
+ modal_version/__init__.py,sha256=1tWa1M1VudQkHGtS6UrdWTEZtkFppH0-zcQKiOPJx-8,121
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal-1.0.5.dev23.dist-info/METADATA,sha256=AMPeD0Y00laXrpf79rH9e6ObJvxQZo-Riur_EnVV6qI,2462
176
- modal-1.0.5.dev23.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.5.dev23.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.5.dev23.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.5.dev23.dist-info/RECORD,,
175
+ modal-1.0.5.dev26.dist-info/METADATA,sha256=kkm_i4zxdAdYz27Hfy5Aw0cUZhQGuTtGRpYT3AkDgNM,2462
176
+ modal-1.0.5.dev26.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
+ modal-1.0.5.dev26.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-1.0.5.dev26.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
+ modal-1.0.5.dev26.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1920,6 +1920,9 @@ message Image {
1920
1920
  bool runtime_debug = 20;
1921
1921
 
1922
1922
  BuildFunction build_function = 21;
1923
+
1924
+ // Build arguments for the image (--build-arg) for ARG substitution in Dockerfile.
1925
+ map<string, string> build_args = 22;
1923
1926
  }
1924
1927
 
1925
1928
  message ImageContextFile {