from pydantic import BaseModel, Field from typing import Optional, Any from datetime import datetime class Response(BaseModel): code: int = 0 data: Any = None message: str = "ok" class PageData(BaseModel): items: list = [] total: int = 0 page: int = 1 page_size: int = 20 # 模板 class TemplateCreate(BaseModel): name: str description: str = "" class TemplateOut(BaseModel): id: int name: str description: str = "" file_path: str = "" paragraph_count: int = 0 status: str = "draft" created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class ParagraphConfig(BaseModel): id: int = 0 sort_index: int = 0 title: str = "" edit_mode: str = "ai" model_id: Optional[int] = None need_prompt: bool = True prompt_text: str = "" need_file: bool = False file_note: str = "" output_format: str = "text" class TemplateSave(BaseModel): paragraphs: list[ParagraphConfig] = [] # 模型 class AiModelCreate(BaseModel): name: str provider: str = "" api_format: str = "openai" api_endpoint: str = "" api_key: str = "" status: str = "enabled" class AiModelOut(BaseModel): id: int name: str provider: str = "" api_format: str = "openai" api_endpoint: str = "" api_key_preview: str = "" status: str = "enabled" created_at: Optional[datetime] = None # 生成 class GenerateTestRequest(BaseModel): paragraph_id: int template_id: int prompt_text: str = "" model_id: int = 0 file_paths: list[str] = [] class GenerateFullRequest(BaseModel): template_id: int file_map: dict[str, str] = {} # paragraph_id -> file_path class DocumentOut(BaseModel): id: int template_id: int name: str para_count_done: int = 0 para_count_total: int = 0 status: str = "pending" file_path: str = "" error: str = "" created_at: Optional[datetime] = None