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 +2 -2
 - modal/_functions.py +5 -0
 - modal/_resolver.py +6 -0
 - modal/_utils/function_utils.py +5 -0
 - modal/app.py +5 -1
 - modal/app.pyi +4 -0
 - modal/cli/_traceback.py +2 -2
 - modal/client.pyi +2 -2
 - modal/functions.pyi +1 -0
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/METADATA +1 -1
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/RECORD +19 -19
 - modal_proto/api.proto +9 -0
 - modal_proto/api_pb2.py +590 -564
 - modal_proto/api_pb2.pyi +51 -3
 - modal_version/_version_generated.py +1 -1
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/WHEEL +0 -0
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/entry_points.txt +0 -0
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/licenses/LICENSE +0 -0
 - {modal-0.74.11.dist-info → modal-0.74.12.dist-info}/top_level.txt +0 -0
 
    
        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  
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
      
 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
         
     | 
    
        modal/_utils/function_utils.py
    CHANGED
    
    | 
         @@ -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  
     | 
| 
       165 
     | 
    
         
            -
                """Patch the warnings module to make  
     | 
| 
      
 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. 
     | 
| 
      
 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. 
     | 
| 
      
 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,16 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            modal/__init__.py,sha256=7wz1AT_bpWJJEzXsAo3QMb7i87y7UGXwfneb0bGDhRg,2502
         
     | 
| 
       2 
     | 
    
         
            -
            modal/__main__.py,sha256= 
     | 
| 
      
 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= 
     | 
| 
      
 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 
     | 
| 
      
 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= 
     | 
| 
       22 
     | 
    
         
            -
            modal/app.pyi,sha256= 
     | 
| 
      
 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= 
     | 
| 
      
 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= 
     | 
| 
      
 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= 
     | 
| 
      
 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= 
     | 
| 
      
 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. 
     | 
| 
      
 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= 
     | 
| 
      
 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= 
     | 
| 
       159 
     | 
    
         
            -
            modal_proto/api_pb2.pyi,sha256= 
     | 
| 
      
 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= 
     | 
| 
       174 
     | 
    
         
            -
            modal-0.74. 
     | 
| 
       175 
     | 
    
         
            -
            modal-0.74. 
     | 
| 
       176 
     | 
    
         
            -
            modal-0.74. 
     | 
| 
       177 
     | 
    
         
            -
            modal-0.74. 
     | 
| 
       178 
     | 
    
         
            -
            modal-0.74. 
     | 
| 
      
 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;
         
     |