from __future__ import annotations import os from typing import ( Any, AsyncGenerator, Generator, AsyncIterator, Iterator, NewType, Tuple, Union, List, Dict, Type, IO, Optional, TYPE_CHECKING, ) from typing_extensions import TypedDict # Only import PIL for type-checkers; no runtime dependency required. if TYPE_CHECKING: from PIL.Image import Image as PILImage else: class PILImage: # minimal placeholder to avoid runtime import errors pass # Response chunk type from providers from .providers.response import ResponseType # ---- Hashes & cookie aliases ------------------------------------------------- SHA256 = NewType("SHA256", str) Cookies = Dict[str, str] # ---- Streaming result types -------------------------------------------------- CreateResult = Iterator[Union[str, ResponseType]] AsyncResult = AsyncIterator[Union[str, ResponseType]] # ---- Message schema ---------------------------------------------------------- # Typical message structure: # {"role": "user" | "assistant" | "system" | "tool", "content": str | [ContentPart, ...]} # where content parts can be text or (optionally) structured pieces like images. class ContentPart(TypedDict, total=False): type: str # e.g., "text", "image_url", etc. text: str # present when type == "text" image_url: Dict[str, str] # present when type == "image_url" input_audio: Dict[str, str] # present when type == "input_audio" bucket_id: str name: str class Message(TypedDict): role: str content: Union[str, List[ContentPart]] Messages = List[Message] # ---- Media inputs ------------------------------------------------------------ # Paths, raw bytes, file-like objects, or PIL Image objects are accepted. ImageType = Union[str, bytes, IO[bytes], PILImage, os.PathLike] MediaListType = List[Tuple[ImageType, Optional[str]]] __all__ = [ "Any", "AsyncGenerator", "Generator", "AsyncIterator", "Iterator", "Tuple", "Union", "List", "Dict", "Type", "IO", "Optional", "TypedDict", "SHA256", "CreateResult", "AsyncResult", "Messages", "Message", "ContentPart", "Cookies", "Image", "ImageType", "MediaListType", "ResponseType", ]