""" schemas/write.py 后评价报告项目相关的 Pydantic 数据模型。 """ from __future__ import annotations from typing import Any, List, Optional from pydantic import BaseModel # ---------- 版本 ---------- class DocVersion(BaseModel): id: str version: str content: str savedAt: str author: str note: Optional[str] = "" citationPayload: Optional[dict[str, Any]] = None # ---------- 文档 ---------- class WriteDocument(BaseModel): id: str title: str content: str wordCount: int createdAt: str updatedAt: str projectId: str status: str # draft | review | published versions: List[DocVersion] = [] class WriteDocumentSummary(BaseModel): """列表页只返回摘要,不含 content 正文""" id: str title: str wordCount: int createdAt: str updatedAt: str projectId: str status: str # ---------- 项目 ---------- class WriteProject(BaseModel): id: str uuid: str # 项目唯一标识,与 kb 共用 name: str description: Optional[str] = "" createdAt: str updatedAt: str docCount: int status: str # active | archived kbProjectId: Optional[str] = None color: str documents: List[WriteDocument] = [] class WriteProjectSummary(BaseModel): """列表页摘要,不含 documents""" id: str uuid: Optional[str] = None # 项目唯一标识,用于 URL 参数;兼容旧数据 name: str description: Optional[str] = "" createdAt: str updatedAt: str docCount: int status: str kbProjectId: Optional[str] = None color: str # ---------- 创建 / 更新请求体 ---------- class WriteProjectCreate(BaseModel): name: str description: Optional[str] = "" kbProjectId: Optional[str] = None color: Optional[str] = "#3b82f6" class WriteProjectUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None status: Optional[str] = None kbProjectId: Optional[str] = None color: Optional[str] = None class WriteDocumentCreate(BaseModel): title: str content: Optional[str] = "" class WriteDocumentUpdate(BaseModel): title: Optional[str] = None content: Optional[str] = None status: Optional[str] = None class DocVersionCreate(BaseModel): version: Optional[str] = None content: str author: str note: Optional[str] = "" citationPayload: Optional[dict[str, Any]] = None # ---------- 章节审查(智能体) ---------- class ChapterReviewRequest(BaseModel): """章节智能审查请求体:选择章节 + 输入待审查文本。""" chapter: str # "1"~"6" content: str class ChapterReviewResponse(BaseModel): """章节智能审查响应体:返回 Markdown 审查报告。""" success: bool = True chapter: str review: str model: Optional[str] = None message: Optional[str] = "" class GenerateReportJobCreate(BaseModel): templateId: Optional[str] = None topK: int = 10 class GenerateReportChapterItem(BaseModel): sectionKey: str sectionTitle: str sectionOrder: int status: str updatedAt: Optional[str] = None errorMessage: Optional[str] = None class GenerateReportJobItem(BaseModel): jobId: str projectId: str templateId: Optional[str] = None status: str progress: int currentSectionKey: Optional[str] = None errorMessage: Optional[str] = None createdAt: Optional[str] = None updatedAt: Optional[str] = None completedAt: Optional[str] = None chapters: List[GenerateReportChapterItem] = [] class GenerateReportResultChapter(BaseModel): sectionKey: str sectionTitle: str sectionOrder: int status: str content: Optional[str] = None errorMessage: Optional[str] = None promptText: Optional[str] = None evidencePayload: Optional[dict] = None validationPayload: Optional[dict] = None class GenerateReportResult(BaseModel): jobId: str status: str report: Optional[str] = None consistency: List[str] = [] chapters: List[GenerateReportResultChapter] = []