document.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from datetime import datetime
  2. from typing import Literal, Optional
  3. from pydantic import BaseModel, Field, model_validator
  4. # ---------- 局部块更新 ----------
  5. class BlockUpdate(BaseModel):
  6. level: int = Field(..., ge=1, le=6)
  7. index: int = Field(..., ge=0)
  8. content: str
  9. # ---------- 请求 ----------
  10. class CreateDocumentRequest(BaseModel):
  11. user_id: str = Field(..., alias="userId")
  12. file_url: str = Field(..., alias="fileUrl")
  13. session_id: str = Field(..., alias="sessionId")
  14. model_config = {"populate_by_name": True}
  15. class UpdateDocumentRequest(BaseModel):
  16. content: Optional[str] = None
  17. blocks: Optional[list[BlockUpdate]] = None
  18. @model_validator(mode="after")
  19. def check_content_or_blocks(self) -> "UpdateDocumentRequest":
  20. if self.content is not None and self.blocks is not None:
  21. raise ValueError("content 与 blocks 不能同时传入")
  22. return self
  23. # ---------- 响应 ----------
  24. class DocumentResponse(BaseModel):
  25. id: str
  26. content: str
  27. format: str
  28. session_id: str = Field(..., serialization_alias="sessionId")
  29. user_id: Optional[str] = Field(None, serialization_alias="userId")
  30. created_at: datetime = Field(..., serialization_alias="createdAt")
  31. updated_at: datetime = Field(..., serialization_alias="updatedAt")
  32. model_config = {"from_attributes": True, "populate_by_name": True}
  33. class DocumentListItem(BaseModel):
  34. id: str
  35. session_id: str = Field(..., serialization_alias="sessionId")
  36. created_at: datetime = Field(..., serialization_alias="createdAt")
  37. updated_at: datetime = Field(..., serialization_alias="updatedAt")
  38. model_config = {"from_attributes": True, "populate_by_name": True}
  39. class Pagination(BaseModel):
  40. page: int
  41. page_size: int = Field(..., serialization_alias="pageSize")
  42. total: int
  43. total_pages: int = Field(..., serialization_alias="totalPages")
  44. model_config = {"populate_by_name": True}