from datetime import datetime from pydantic import BaseModel, Field class NovelCreate(BaseModel): title: str = Field(min_length=1, max_length=200) description: str = Field(default="", max_length=2000) class NovelUpdate(BaseModel): title: str | None = Field(default=None, min_length=1, max_length=200) description: str | None = Field(default=None, max_length=2000) class NovelRead(BaseModel): id: int title: str description: str created_at: datetime updated_at: datetime class NovelList(BaseModel): items: list[NovelRead] total: int # ── 大纲 ── class OutlineCreate(BaseModel): summary: str = Field(min_length=1, max_length=200) detail: str = Field(default="", max_length=1000) class OutlineUpdate(BaseModel): summary: str | None = Field(default=None, min_length=1, max_length=200) detail: str | None = Field(default=None, max_length=1000) sort_order: int | None = None class OutlineRead(BaseModel): id: int novel_id: int sort_order: int summary: str detail: str created_at: datetime updated_at: datetime class OutlineList(BaseModel): items: list[OutlineRead] total: int class OutlineReorder(BaseModel): """排序请求:按顺序传入大纲id列表""" ordered_ids: list[int] # ── AI配置 ── class AIConfigSave(BaseModel): provider: str = Field(default="openai") base_url: str = Field(default="https://api.openai.com/v1") api_key: str = Field(min_length=1) model: str = Field(default="gpt-4o") class AIConfigRead(BaseModel): id: int provider: str base_url: str api_key_masked: str # 脱敏后的key model: str updated_at: datetime # ── 聊天 ── class ChatMessageInput(BaseModel): role: str content: str class ChatRequest(BaseModel): messages: list[ChatMessageInput] novel_id: int | None = None class ChatMessageRead(BaseModel): id: int novel_id: int | None role: str content: str created_at: datetime class ChatMessageList(BaseModel): items: list[ChatMessageRead] total: int