from __future__ import annotations from typing import Protocol, runtime_checkable @runtime_checkable class IS3(Protocol): async def upload_bytes(self, *, key: str, body: bytes, content_type: str) -> str: ... async def delete_object(self, *, key: str) -> None: ... def object_key_from_public_url(self, url: str) -> str | None: ...