modal 0.74.11__py3-none-any.whl → 0.74.12__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/__main__.py CHANGED
@@ -2,7 +2,7 @@
2
2
  import sys
3
3
 
4
4
  from ._traceback import reduce_traceback_to_user_code
5
- from .cli._traceback import highlight_modal_deprecation_warnings, setup_rich_traceback
5
+ from .cli._traceback import highlight_modal_warnings, setup_rich_traceback
6
6
  from .cli.entry_point import entrypoint_cli
7
7
  from .cli.import_refs import _CliUserExecutionError
8
8
  from .config import config
@@ -11,7 +11,7 @@ from .config import config
11
11
  def main():
12
12
  # Setup rich tracebacks, but only on user's end, when using the Modal CLI.
13
13
  setup_rich_traceback()
14
- highlight_modal_deprecation_warnings()
14
+ highlight_modal_warnings()
15
15
 
16
16
  try:
17
17
  entrypoint_cli()
modal/_functions.py CHANGED
@@ -459,6 +459,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
459
459
  ephemeral_disk: Optional[int] = None,
460
460
  # current default: first-party, future default: main-package
461
461
  include_source: Optional[bool] = None,
462
+ experimental_options: Optional[dict[str, str]] = None,
462
463
  _experimental_proxy_ip: Optional[str] = None,
463
464
  _experimental_custom_scaling_factor: Optional[float] = None,
464
465
  _experimental_enable_gpu_snapshot: bool = False,
@@ -819,6 +820,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
819
820
  i6pn_enabled=i6pn_enabled,
820
821
  schedule=schedule.proto_message if schedule is not None else None,
821
822
  snapshot_debug=config.get("snapshot_debug"),
823
+ experimental_options=experimental_options or {},
824
+ # ---
822
825
  _experimental_group_size=cluster_size or 0, # Experimental: Clustered functions
823
826
  _experimental_concurrent_cancellations=True,
824
827
  _experimental_proxy_ip=_experimental_proxy_ip,
@@ -856,6 +859,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
856
859
  use_method_name=function_definition.use_method_name,
857
860
  method_definitions=function_definition.method_definitions,
858
861
  method_definitions_set=function_definition.method_definitions_set,
862
+ experimental_options=experimental_options or {},
859
863
  _experimental_group_size=function_definition._experimental_group_size,
860
864
  _experimental_buffer_containers=function_definition._experimental_buffer_containers,
861
865
  _experimental_custom_scaling=function_definition._experimental_custom_scaling,
@@ -913,6 +917,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
913
917
  raise InvalidError(f"Function {info.function_name} is too large to deploy.")
914
918
  raise
915
919
  function_creation_status.set_response(response)
920
+
916
921
  # needed for modal.serve file watching
917
922
  serve_mounts = {m for m in all_mounts if m.is_local()}
918
923
  serve_mounts |= image._serve_mounts
modal/_resolver.py CHANGED
@@ -10,6 +10,8 @@ from typing import TYPE_CHECKING, Optional
10
10
 
11
11
  from grpclib import GRPCError, Status
12
12
 
13
+ from modal_proto import api_pb2
14
+
13
15
  from ._utils.async_utils import TaskContext
14
16
  from .client import _Client
15
17
  from .exception import NotFoundError
@@ -34,6 +36,10 @@ class StatusRow:
34
36
  if self._spinner is not None:
35
37
  self._spinner.update(text=message)
36
38
 
39
+ def warning(self, warning: api_pb2.Warning):
40
+ if self._step_node is not None:
41
+ self._step_node.add(f"[yellow]:warning:[/yellow] {warning.message}")
42
+
37
43
  def finish(self, message):
38
44
  if self._step_node is not None and self._spinner is not None:
39
45
  from ._output import OutputManager
@@ -584,6 +584,8 @@ class FunctionCreationStatus:
584
584
  suffix = _get_suffix_from_web_url_info(url_info)
585
585
  # TODO: this is only printed when we're showing progress. Maybe move this somewhere else.
586
586
  web_url = self.response.handle_metadata.web_url
587
+ for warning in self.response.server_warnings:
588
+ self.status_row.warning(warning)
587
589
  self.status_row.finish(
588
590
  f"Created web function {self.tag} => [magenta underline]{web_url}[/magenta underline]"
589
591
  f"{proxy_auth_suffix}{suffix}"
@@ -595,7 +597,10 @@ class FunctionCreationStatus:
595
597
  custom_domain_status_row.finish(
596
598
  f"Custom domain for {self.tag} => [magenta underline]{custom_domain.url}[/magenta underline]"
597
599
  )
600
+
598
601
  else:
602
+ for warning in self.response.server_warnings:
603
+ self.status_row.warning(warning)
599
604
  self.status_row.finish(f"Created function {self.tag}.")
600
605
  if self.response.function.method_definitions_set:
601
606
  for method_definition in self.response.function.method_definitions.values():
modal/app.py CHANGED
@@ -613,6 +613,7 @@ class _App:
613
613
  i6pn: Optional[bool] = None, # Whether to enable IPv6 container networking within the region.
614
614
  # Whether the function's home package should be included in the image - defaults to True
615
615
  include_source: Optional[bool] = None, # When `False`, don't automatically add the App source to the container.
616
+ experimental_options: Optional[dict[str, Any]] = None,
616
617
  # Parameters below here are experimental. Use with caution!
617
618
  _experimental_scheduler_placement: Optional[
618
619
  SchedulerPlacement
@@ -780,10 +781,11 @@ class _App:
780
781
  block_network=block_network,
781
782
  max_inputs=max_inputs,
782
783
  scheduler_placement=scheduler_placement,
783
- _experimental_proxy_ip=_experimental_proxy_ip,
784
784
  i6pn_enabled=i6pn_enabled,
785
785
  cluster_size=cluster_size, # Experimental: Clustered functions
786
786
  include_source=include_source if include_source is not None else self._include_source_default,
787
+ experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
788
+ _experimental_proxy_ip=_experimental_proxy_ip,
787
789
  _experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
788
790
  )
789
791
 
@@ -836,6 +838,7 @@ class _App:
836
838
  # Use `max_inputs = 1` for single-use containers.
837
839
  max_inputs: Optional[int] = None,
838
840
  include_source: Optional[bool] = None, # When `False`, don't automatically add the App source to the container.
841
+ experimental_options: Optional[dict[str, Any]] = None,
839
842
  # Parameters below here are experimental. Use with caution!
840
843
  _experimental_scheduler_placement: Optional[
841
844
  SchedulerPlacement
@@ -947,6 +950,7 @@ class _App:
947
950
  max_inputs=max_inputs,
948
951
  scheduler_placement=scheduler_placement,
949
952
  include_source=include_source if include_source is not None else self._include_source_default,
953
+ experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
950
954
  _experimental_proxy_ip=_experimental_proxy_ip,
951
955
  _experimental_custom_scaling_factor=_experimental_custom_scaling_factor,
952
956
  _experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
modal/app.pyi CHANGED
@@ -192,6 +192,7 @@ class _App:
192
192
  max_inputs: typing.Optional[int] = None,
193
193
  i6pn: typing.Optional[bool] = None,
194
194
  include_source: typing.Optional[bool] = None,
195
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
195
196
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
196
197
  _experimental_proxy_ip: typing.Optional[str] = None,
197
198
  _experimental_custom_scaling_factor: typing.Optional[float] = None,
@@ -239,6 +240,7 @@ class _App:
239
240
  block_network: bool = False,
240
241
  max_inputs: typing.Optional[int] = None,
241
242
  include_source: typing.Optional[bool] = None,
243
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
242
244
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
243
245
  _experimental_proxy_ip: typing.Optional[str] = None,
244
246
  _experimental_custom_scaling_factor: typing.Optional[float] = None,
@@ -432,6 +434,7 @@ class App:
432
434
  max_inputs: typing.Optional[int] = None,
433
435
  i6pn: typing.Optional[bool] = None,
434
436
  include_source: typing.Optional[bool] = None,
437
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
435
438
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
436
439
  _experimental_proxy_ip: typing.Optional[str] = None,
437
440
  _experimental_custom_scaling_factor: typing.Optional[float] = None,
@@ -479,6 +482,7 @@ class App:
479
482
  block_network: bool = False,
480
483
  max_inputs: typing.Optional[int] = None,
481
484
  include_source: typing.Optional[bool] = None,
485
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
482
486
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
483
487
  _experimental_proxy_ip: typing.Optional[str] = None,
484
488
  _experimental_custom_scaling_factor: typing.Optional[float] = None,
modal/cli/_traceback.py CHANGED
@@ -161,8 +161,8 @@ def setup_rich_traceback() -> None:
161
161
  install(suppress=[synchronicity, grpclib, click, typer], extra_lines=1)
162
162
 
163
163
 
164
- def highlight_modal_deprecation_warnings() -> None:
165
- """Patch the warnings module to make client deprecation warnings more salient in the CLI."""
164
+ def highlight_modal_warnings() -> None:
165
+ """Patch the warnings module to make certain warnings more salient in the CLI."""
166
166
  base_showwarning = warnings.showwarning
167
167
 
168
168
  def showwarning(warning, category, filename, lineno, file=None, line=None):
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.74.11"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.12"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.11"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.12"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/functions.pyi CHANGED
@@ -98,6 +98,7 @@ class Function(
98
98
  max_inputs: typing.Optional[int] = None,
99
99
  ephemeral_disk: typing.Optional[int] = None,
100
100
  include_source: typing.Optional[bool] = None,
101
+ experimental_options: typing.Optional[dict[str, str]] = None,
101
102
  _experimental_proxy_ip: typing.Optional[str] = None,
102
103
  _experimental_custom_scaling_factor: typing.Optional[float] = None,
103
104
  _experimental_enable_gpu_snapshot: bool = False,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.11
3
+ Version: 0.74.12
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,16 +1,16 @@
1
1
  modal/__init__.py,sha256=7wz1AT_bpWJJEzXsAo3QMb7i87y7UGXwfneb0bGDhRg,2502
2
- modal/__main__.py,sha256=CgIjP8m1xJjjd4AXc-delmR6LdBCZclw2A_V38CFIio,2870
2
+ 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=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
5
  modal/_container_entrypoint.py,sha256=DymOImhc3uGRkIq_qXmBsEbWMB4EBMpfuXzz2S4BcGg,29404
6
- modal/_functions.py,sha256=oJ16Y7ud_5IaFPduOt8z3iftz9fPTSxeVmrDwY2Hmiw,74668
6
+ modal/_functions.py,sha256=JGkxTOL6dcKIK2kCZfalzAO5JZXABVk0rc1Id1QgmCg,74900
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=JBIECWdfpRKCaCxVWZbC3Q1kF5Whk_EKvY9f4Y6AFyg,11446
10
10
  modal/_output.py,sha256=Z0nngPh2mKHMQc4MQ92YjVPc3ewOLa3I4dFBlL9nvQY,25656
11
11
  modal/_partial_function.py,sha256=8mmd5lvjZaC7qi0KAnLR1H590MlxNslAE2_Kr9biJUA,39704
12
12
  modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
13
- modal/_resolver.py,sha256=owmQ72ZuGvrTpHxguTMYJyodnfeYcSP0MPV8wvkGa74,7375
13
+ modal/_resolver.py,sha256=-nolqj_p_mx5czVYj1Mazh2IQWpSMrTOGughVJqYfo8,7579
14
14
  modal/_resources.py,sha256=5qmcirXUI8dSH926nwkUaeX9H25mqYu9mXD_KuT79-o,1733
15
15
  modal/_serialization.py,sha256=wAgaALThfr-DBV9LMhM4qY_PCH7SRhA9xgoHL2bapBk,22963
16
16
  modal/_traceback.py,sha256=IZQzB3fVlUfMHOSyKUgw0H6qv4yHnpyq-XVCNZKfUdA,5023
@@ -18,11 +18,11 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
18
18
  modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
19
19
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
20
20
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
21
- modal/app.py,sha256=4EeD3MXXpaeSFatuWt80xGbMH9cSYS3b9m9z3PQDlwU,48144
22
- modal/app.pyi,sha256=SkqXNrdnGIZ4MmNNvpGtzNLoUdyuvi9IjQQR_DRiRHk,26968
21
+ modal/app.py,sha256=1GSPMMYRkG17FQwnA_PleK9YQrPQWXlN_4mpZ5VRA4Q,48468
22
+ modal/app.pyi,sha256=bpC9uN_B4d_UtyXVuhGpXC2RM-IcsytS0ndu-GoKrHQ,27276
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
25
- modal/client.pyi,sha256=HnqTWOBLH_vhuAK1OYl6KnCM46HIIgoImQtswbmn5YU,7593
25
+ modal/client.pyi,sha256=eoSW7y3yv0zF18hQiPencyPpa0An7ZlLG331wvy9AK0,7593
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=GvaNl8R5UsH7Vg88WEOyerdjvZEPK7xxi3nqHlyOW_c,33497
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
39
39
  modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
40
40
  modal/file_pattern_matcher.py,sha256=trosX-Bp7dOubudN1bLLhRAoidWy1TcoaR4Pv8CedWw,6497
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=m1PL2pwO-lnGV0uZDVCmzZ_v7Mu8ISRtxmxS15aEIAQ,14785
42
+ modal/functions.pyi,sha256=2J7jPa2tQWhuUy67wg-MWvEx0rwrBNjX6UTEJbAUq_A,14855
43
43
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
44
44
  modal/image.py,sha256=I-9_YZL0SSfnuGPywa3-4PlxDmJ-53p7ce3gP74SrOA,92877
45
45
  modal/image.pyi,sha256=89zv12C1sFrJs7Es9SnX23_m208ASAdeNGCVTrhjzHI,25632
@@ -96,7 +96,7 @@ modal/_utils/blob_utils.py,sha256=jWJovk4g-YNG3CvkvglOds4a6D1M0Tcal_59v7y9VsM,14
96
96
  modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
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=t5uVhvmQKFmLmJko_Vv8g99-PGqm1a4QQWIQNt44jKg,26688
99
+ modal/_utils/function_utils.py,sha256=z6v8A5Ee827K9f2XV1c2_Ea6iv_zcaxbXySER-qW5XQ,26903
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=oxDMEzr7BzE2NhQn53gnQwKCkpHruTbbBZg8-fuiP7E,8529
@@ -116,7 +116,7 @@ modal/_vendor/cloudpickle.py,sha256=avxOIgNKqL9KyPNuIOVQzBm0D1l9ipeB4RrcUMUGmeQ,
116
116
  modal/_vendor/tblib.py,sha256=g1O7QUDd3sDoLd8YPFltkXkih7r_fyZOjgmGuligv3s,9722
117
117
  modal/cli/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
118
118
  modal/cli/_download.py,sha256=t6BXZwjTd9MgznDvbsV8rp0FZWggdzC-lUAGZU4xx1g,3984
119
- modal/cli/_traceback.py,sha256=QlLa_iw3fAOA-mqCqjS8qAxvNT48J3YY3errtVVc2cw,7316
119
+ modal/cli/_traceback.py,sha256=4ywtmFcmPnY3tqb4-3fA061N2tRiM01xs8fSagtkwhE,7293
120
120
  modal/cli/app.py,sha256=87LWg3bTQQIHFOqs8iiJYD_X03omXBZ6lFYR0rMJV-I,8433
121
121
  modal/cli/config.py,sha256=QvFsqO4eUOtI7d_pQAOAyfq_ZitjhPtav3C6GIDQcZM,1680
122
122
  modal/cli/container.py,sha256=FYwEgjf93j4NMorAjGbSV98i1wpebqdAeNU1wfrFp1k,3668
@@ -145,7 +145,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
145
145
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
146
146
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
147
147
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
148
- modal-0.74.11.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
148
+ modal-0.74.12.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
149
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
150
150
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
151
151
  modal_docs/gen_reference_docs.py,sha256=cvTgltucqYLLIX84QxAwf51Z5Vc2n6cLxS8VcrxNCAo,6401
@@ -153,10 +153,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
153
153
  modal_docs/mdmd/mdmd.py,sha256=Irx49MCCTlBOP4FBdLR--JrpA3-WhsVeriq0LGgsRic,6232
154
154
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
155
155
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
156
- modal_proto/api.proto,sha256=WAhgZhYHZMkMY9atv-3NVDCvi7dOIRWg44pB8FlEa-I,92559
156
+ modal_proto/api.proto,sha256=ZCqlmEi8Z_UPUsxnyY0rj8hIXr1HtHApqoGflR-ypAo,93046
157
157
  modal_proto/api_grpc.py,sha256=DlrVx10B6HLy4LjWrgK7HJ7kUNDKqEvm6mUqh-6EVvs,112161
158
- modal_proto/api_pb2.py,sha256=3TKHLp49XvK3utem8Bfa0iuS-2q_kMOl5JBWWTZs43Q,326216
159
- modal_proto/api_pb2.pyi,sha256=7gqajulYGsCXshdIzPWQNOru4eZVdSgpfb7oLbC0JGA,444242
158
+ modal_proto/api_pb2.py,sha256=MPC2-mCFuy8NxXzpKTiyexm-T1IfxN_p-qBAB9XI7c8,328268
159
+ modal_proto/api_pb2.pyi,sha256=kz5M2tRlRtKNmnFb3b3nCEWZWZY85s0TNZ0xs2TroZM,446747
160
160
  modal_proto/api_pb2_grpc.py,sha256=NQPpAa3Co-zFNB6L6BQoZjf-RaOlWFFPX8chQyGHQEo,242401
161
161
  modal_proto/api_pb2_grpc.pyi,sha256=zK2Ms2Xws02cC9uy5U5A5sPULXx4T6A9o9BONqFcipg,56456
162
162
  modal_proto/modal_api_grpc.py,sha256=K_GsrHIw2CayKh_nyuYAblQW_tOijUNW267Hs9vWUWU,14948
@@ -170,9 +170,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
170
170
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  modal_version/__init__.py,sha256=m94xZNWIjH8oUtJk4l9xfovzDJede2o7X-q0MHVECtM,470
172
172
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
173
- modal_version/_version_generated.py,sha256=Q6_WmJCN3kmmDi4__sWsFH-LUoey-jXVhpMkOxdxV3M,149
174
- modal-0.74.11.dist-info/METADATA,sha256=mVEXsSYEGU1Fob3uTp0Lx10tD5mzqY6RdWGmpzyQdJk,2474
175
- modal-0.74.11.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
- modal-0.74.11.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
- modal-0.74.11.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
- modal-0.74.11.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=lCmI3tXFsN320hsNte42DBS1ZM1ZGpHOqEgCvda6x_Y,149
174
+ modal-0.74.12.dist-info/METADATA,sha256=gfzeojo09jV7Mgv_PnfcvYiuo6cOZ9j_2oXvuTTrur4,2474
175
+ modal-0.74.12.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
+ modal-0.74.12.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
+ modal-0.74.12.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
+ modal-0.74.12.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1341,6 +1341,11 @@ message Function {
1341
1341
 
1342
1342
  AutoscalerSettings autoscaler_settings = 79; // Bundle of parameters related to autoscaling
1343
1343
  FunctionSchema function_schema = 80;
1344
+
1345
+ // For server-side experimental functionality. Prefer using this over individual _experimental_* fields.
1346
+ // Note the value type as string. Internally we'll coerce all values to string with str().
1347
+ // On the server, it's necessary to convert back to the most natural type (e.g. int) when relevant.
1348
+ map<string, string> experimental_options = 81;
1344
1349
  }
1345
1350
 
1346
1351
  message FunctionAsyncInvokeRequest {
@@ -1425,6 +1430,7 @@ message FunctionCreateResponse {
1425
1430
  string __deprecated_web_url = 2 [ deprecated = true]; // Used up until 0.62.212
1426
1431
  Function function = 4;
1427
1432
  FunctionHandleMetadata handle_metadata = 5;
1433
+ repeated Warning server_warnings = 6;
1428
1434
  }
1429
1435
 
1430
1436
  message FunctionData {
@@ -1490,6 +1496,8 @@ message FunctionData {
1490
1496
 
1491
1497
  AutoscalerSettings autoscaler_settings = 31; // Bundle of parameters related to autoscaling
1492
1498
  FunctionSchema function_schema = 32;
1499
+
1500
+ map<string, string> experimental_options = 33;
1493
1501
  }
1494
1502
 
1495
1503
  message FunctionExtended {
@@ -3028,6 +3036,7 @@ message Warning {
3028
3036
  WARNING_TYPE_UNSPECIFIED = 0;
3029
3037
  WARNING_TYPE_CLIENT_DEPRECATION = 1;
3030
3038
  WARNING_TYPE_RESOURCE_LIMIT = 2;
3039
+ WARNING_TYPE_FUNCTION_CONFIGURATION = 3;
3031
3040
  }
3032
3041
  WarningType type = 1;
3033
3042
  string message = 2;