from typing import Any, Literal from pydantic import BaseModel, Field BBox = tuple[float, float, float, float] class Provenance(BaseModel): asset_id: str bbox: BBox | None = None extraction_method: str confidence: float lens_version: str class VisualAssetRecord(BaseModel): id: str conversation_id: str source_file_id: str | None = None upload_order: int sha256: str original_uri: str mime_type: str width: int height: int aliases: list[str] = Field(default_factory=list) class VisualViewRecord(BaseModel): id: str asset_id: str view_type: str lens_name: str lens_version: str parameters_hash: str status: Literal["pending", "ready", "failed"] = "ready" payload_json: dict[str, Any] confidence: float provenance_json: list[Provenance] = Field(default_factory=list)