from typing import Generic, TypeVar from pydantic import BaseModel, ConfigDict T = TypeVar("T") class ApiResponse(BaseModel, Generic[T]): """与 aiclient 前端约定的统一响应结构。""" model_config = ConfigDict(from_attributes=True) ok: bool message: str = "" data: T | None = None class PaginatedData(BaseModel, Generic[T]): """分页列表载荷。""" items: list[T] total: int page: int page_size: int total_pages: int @classmethod def build( cls, items: list[T], *, total: int, page: int, page_size: int, ) -> "PaginatedData[T]": total_pages = (total + page_size - 1) // page_size if total > 0 else 0 return cls( items=items, total=total, page=page, page_size=page_size, total_pages=total_pages, )