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 anchor_title: str = "" title: str = "" content: str = "" edit_mode: str = "manual" write_mode: str = "replace_section" 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 = "" supports_streaming: bool = False enable_reasoning: bool = False status: str = "enabled" class AiModelUpdate(BaseModel): name: Optional[str] = None provider: Optional[str] = None api_format: Optional[str] = None api_endpoint: Optional[str] = None api_key: str = "" supports_streaming: Optional[bool] = None enable_reasoning: Optional[bool] = None status: Optional[str] = None class AiModelOut(BaseModel): id: int name: str provider: str = "" api_format: str = "openai" api_endpoint: str = "" api_key_preview: str = "" supports_streaming: bool = False enable_reasoning: bool = False 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, list[str]] = {} # paragraph_id -> file_paths class ReferenceFileUpdate(BaseModel): file_name: str = Field(min_length=1, max_length=255) 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