modal 0.73.172__py3-none-any.whl → 0.74.0__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/_runtime/container_io_manager.py +11 -6
- modal/client.pyi +2 -10
- modal/cls.py +15 -0
- modal/functions.pyi +6 -6
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/METADATA +1 -1
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/RECORD +12 -12
- modal_version/__init__.py +1 -1
- modal_version/_version_generated.py +1 -1
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/WHEEL +0 -0
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/entry_points.txt +0 -0
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/licenses/LICENSE +0 -0
- {modal-0.73.172.dist-info → modal-0.74.0.dist-info}/top_level.txt +0 -0
| @@ -666,12 +666,17 @@ class _ContainerIOManager: | |
| 666 666 | 
             
                        )
         | 
| 667 667 | 
             
                        for input_id, retry_count, result in zip(io_context.input_ids, io_context.retry_counts, results)
         | 
| 668 668 | 
             
                    ]
         | 
| 669 | 
            -
             | 
| 670 | 
            -
             | 
| 671 | 
            -
             | 
| 672 | 
            -
             | 
| 673 | 
            -
             | 
| 674 | 
            -
             | 
| 669 | 
            +
             | 
| 670 | 
            +
                    # There are multiple outputs for a single IOContext in the case of @modal.batched.
         | 
| 671 | 
            +
                    # Limit the batch size to 20 to stay within message size limits and buffer size limits.
         | 
| 672 | 
            +
                    output_batch_size = 20
         | 
| 673 | 
            +
                    for i in range(0, len(outputs), output_batch_size):
         | 
| 674 | 
            +
                        await retry_transient_errors(
         | 
| 675 | 
            +
                            self._client.stub.FunctionPutOutputs,
         | 
| 676 | 
            +
                            api_pb2.FunctionPutOutputsRequest(outputs=outputs[i : i + output_batch_size]),
         | 
| 677 | 
            +
                            additional_status_codes=[Status.RESOURCE_EXHAUSTED],
         | 
| 678 | 
            +
                            max_retries=None,  # Retry indefinitely, trying every 1s.
         | 
| 679 | 
            +
                        )
         | 
| 675 680 |  | 
| 676 681 | 
             
                def serialize_exception(self, exc: BaseException) -> bytes:
         | 
| 677 682 | 
             
                    try:
         | 
    
        modal/client.pyi
    CHANGED
    
    | @@ -27,11 +27,7 @@ class _Client: | |
| 27 27 | 
             
                _snapshotted: bool
         | 
| 28 28 |  | 
| 29 29 | 
             
                def __init__(
         | 
| 30 | 
            -
                    self,
         | 
| 31 | 
            -
                    server_url: str,
         | 
| 32 | 
            -
                    client_type: int,
         | 
| 33 | 
            -
                    credentials: typing.Optional[tuple[str, str]],
         | 
| 34 | 
            -
                    version: str = "0.73.172",
         | 
| 30 | 
            +
                    self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.0"
         | 
| 35 31 | 
             
                ): ...
         | 
| 36 32 | 
             
                def is_closed(self) -> bool: ...
         | 
| 37 33 | 
             
                @property
         | 
| @@ -89,11 +85,7 @@ class Client: | |
| 89 85 | 
             
                _snapshotted: bool
         | 
| 90 86 |  | 
| 91 87 | 
             
                def __init__(
         | 
| 92 | 
            -
                    self,
         | 
| 93 | 
            -
                    server_url: str,
         | 
| 94 | 
            -
                    client_type: int,
         | 
| 95 | 
            -
                    credentials: typing.Optional[tuple[str, str]],
         | 
| 96 | 
            -
                    version: str = "0.73.172",
         | 
| 88 | 
            +
                    self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.0"
         | 
| 97 89 | 
             
                ): ...
         | 
| 98 90 | 
             
                def is_closed(self) -> bool: ...
         | 
| 99 91 | 
             
                @property
         | 
    
        modal/cls.py
    CHANGED
    
    | @@ -455,7 +455,22 @@ class _Cls(_Object, type_prefix="cs"): | |
| 455 455 | 
             
                            "A class can't have both a custom __init__ constructor "
         | 
| 456 456 | 
             
                            "and dataclass-style modal.parameter() annotations"
         | 
| 457 457 | 
             
                        )
         | 
| 458 | 
            +
                    elif has_custom_constructor:
         | 
| 459 | 
            +
                        deprecation_warning(
         | 
| 460 | 
            +
                            (2025, 4, 15),
         | 
| 461 | 
            +
                            f"""
         | 
| 462 | 
            +
            {user_cls} uses a non-default constructor (__init__) method.
         | 
| 463 | 
            +
            Custom constructors will not be supported in a a future version of Modal.
         | 
| 464 | 
            +
             | 
| 465 | 
            +
            To parameterize classes, use dataclass-style modal.parameter() declarations instead,
         | 
| 466 | 
            +
            e.g.:\n
         | 
| 458 467 |  | 
| 468 | 
            +
            class {user_cls.__name__}:
         | 
| 469 | 
            +
                model_name: str = modal.parameter()
         | 
| 470 | 
            +
             | 
| 471 | 
            +
            More information on class parameterization can be found here: https://modal.com/docs/guide/parametrized-functions
         | 
| 472 | 
            +
            """,
         | 
| 473 | 
            +
                        )
         | 
| 459 474 | 
             
                    annotations = user_cls.__dict__.get("__annotations__", {})  # compatible with older pythons
         | 
| 460 475 | 
             
                    missing_annotations = params.keys() - annotations.keys()
         | 
| 461 476 | 
             
                    if missing_annotations:
         | 
    
        modal/functions.pyi
    CHANGED
    
    | @@ -200,11 +200,11 @@ class Function( | |
| 200 200 |  | 
| 201 201 | 
             
                _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
         | 
| 202 202 |  | 
| 203 | 
            -
                class __remote_spec(typing_extensions.Protocol[ | 
| 203 | 
            +
                class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
         | 
| 204 204 | 
             
                    def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
         | 
| 205 205 | 
             
                    async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
         | 
| 206 206 |  | 
| 207 | 
            -
                remote: __remote_spec[modal._functions. | 
| 207 | 
            +
                remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
         | 
| 208 208 |  | 
| 209 209 | 
             
                class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
         | 
| 210 210 | 
             
                    def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
         | 
| @@ -219,19 +219,19 @@ class Function( | |
| 219 219 | 
             
                    self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
         | 
| 220 220 | 
             
                ) -> modal._functions.OriginalReturnType: ...
         | 
| 221 221 |  | 
| 222 | 
            -
                class ___experimental_spawn_spec(typing_extensions.Protocol[ | 
| 222 | 
            +
                class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
         | 
| 223 223 | 
             
                    def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
         | 
| 224 224 | 
             
                    async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
         | 
| 225 225 |  | 
| 226 226 | 
             
                _experimental_spawn: ___experimental_spawn_spec[
         | 
| 227 | 
            -
                    modal._functions. | 
| 227 | 
            +
                    modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
         | 
| 228 228 | 
             
                ]
         | 
| 229 229 |  | 
| 230 | 
            -
                class __spawn_spec(typing_extensions.Protocol[ | 
| 230 | 
            +
                class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
         | 
| 231 231 | 
             
                    def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
         | 
| 232 232 | 
             
                    async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
         | 
| 233 233 |  | 
| 234 | 
            -
                spawn: __spawn_spec[modal._functions. | 
| 234 | 
            +
                spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
         | 
| 235 235 |  | 
| 236 236 | 
             
                def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
         | 
| 237 237 |  | 
| @@ -22,10 +22,10 @@ modal/app.py,sha256=bJp7W3liuVG2VwWkG31tMFogDh84EKppzP8YJFWl3eQ,48140 | |
| 22 22 | 
             
            modal/app.pyi,sha256=SkqXNrdnGIZ4MmNNvpGtzNLoUdyuvi9IjQQR_DRiRHk,26968
         | 
| 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=pERqEWXmayxR1RLgMWEM9QtnR7_564OgPGdtBbBQfH8,7591
         | 
| 26 26 | 
             
            modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
         | 
| 27 27 | 
             
            modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
         | 
| 28 | 
            -
            modal/cls.py,sha256= | 
| 28 | 
            +
            modal/cls.py,sha256=GvaNl8R5UsH7Vg88WEOyerdjvZEPK7xxi3nqHlyOW_c,33497
         | 
| 29 29 | 
             
            modal/cls.pyi,sha256=pTYO9JsRENmsa5pDgzfoRJGm_NpCvEjEx--vs-jJkj8,10902
         | 
| 30 30 | 
             
            modal/config.py,sha256=FlqVyh6LVukMahhmEGQVTwWtwtfoPfHqEo3GDn13EOA,11687
         | 
| 31 31 | 
             
            modal/container_process.py,sha256=vvyK3DVPUMsuqvkKdUiQ49cDLF9JawGrxpglLk5vfgI,6208
         | 
| @@ -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=Bg_zlYSHMYuEXQYLcFU-j1Kwq5zHQ9jggMA_5ZO_du8,14785
         | 
| 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
         | 
| @@ -82,7 +82,7 @@ modal/volume.py,sha256=JAWeDvoAG95tMBv-fYIERyHsJPS_X_xGpxRRmYtb6j0,30096 | |
| 82 82 | 
             
            modal/volume.pyi,sha256=kTsXarphjZILXci84LQy7EyC84eXUs5-7D62IM5q3eE,12491
         | 
| 83 83 | 
             
            modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
         | 
| 84 84 | 
             
            modal/_runtime/asgi.py,sha256=KNarxvZI9z8fnmZl2vbkWTjnoLXs9kqOahkrbsTLkyc,22429
         | 
| 85 | 
            -
            modal/_runtime/container_io_manager.py,sha256= | 
| 85 | 
            +
            modal/_runtime/container_io_manager.py,sha256=GGej42isNXI55185J1m8gq4wbqpbcY5GKPzpznu0M3E,44648
         | 
| 86 86 | 
             
            modal/_runtime/container_io_manager.pyi,sha256=wRd2wHMFru0NmNgiCBVdDTrJGkeVZsZvWwA1fzn8wi8,17009
         | 
| 87 87 | 
             
            modal/_runtime/execution_context.py,sha256=73Y5zH_o-MhVCrkJXakYVlFkKqCa2CWvqoHjOfJrJGg,3034
         | 
| 88 88 | 
             
            modal/_runtime/execution_context.pyi,sha256=TAxQq7uLj7i9r9XbXgFZiSVBWxObFWN-rkssS0I7Vkk,661
         | 
| @@ -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. | 
| 148 | 
            +
            modal-0.74.0.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
         | 
| @@ -168,11 +168,11 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1 | |
| 168 168 | 
             
            modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
         | 
| 169 169 | 
             
            modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
         | 
| 170 170 | 
             
            modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 171 | 
            -
            modal_version/__init__.py,sha256= | 
| 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. | 
| 175 | 
            -
            modal-0. | 
| 176 | 
            -
            modal-0. | 
| 177 | 
            -
            modal-0. | 
| 178 | 
            -
            modal-0. | 
| 173 | 
            +
            modal_version/_version_generated.py,sha256=43I6zTDNuJ_Gtc7g-8ZwrpLysg7eRFcN-OJtJNCbJnE,148
         | 
| 174 | 
            +
            modal-0.74.0.dist-info/METADATA,sha256=FIo6k-64UJSzftr1PJV5kLRFikNgDSmfSpalDeMZ4-A,2473
         | 
| 175 | 
            +
            modal-0.74.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
         | 
| 176 | 
            +
            modal-0.74.0.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
         | 
| 177 | 
            +
            modal-0.74.0.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
         | 
| 178 | 
            +
            modal-0.74.0.dist-info/RECORD,,
         | 
    
        modal_version/__init__.py
    CHANGED
    
    | @@ -7,7 +7,7 @@ from ._version_generated import build_number | |
| 7 7 | 
             
            major_number = 0
         | 
| 8 8 |  | 
| 9 9 | 
             
            # Bump this manually on breaking changes, then reset the number in _version_generated.py
         | 
| 10 | 
            -
            minor_number =  | 
| 10 | 
            +
            minor_number = 74
         | 
| 11 11 |  | 
| 12 12 | 
             
            # Right now, automatically increment the patch number in CI
         | 
| 13 13 | 
             
            __version__ = f"{major_number}.{minor_number}.{max(build_number, 0)}"
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |