Files

100 lines
3.8 KiB
Python
Raw Permalink Normal View History

"""拆书导入相关的 Pydantic Schema"""
from datetime import datetime
from typing import Any, Literal, Optional
from pydantic import BaseModel, Field
TaskStatus = Literal["pending", "running", "completed", "failed", "cancelled"]
ImportMode = Literal["append", "overwrite"]
ExtractLevel = Literal["basic", "standard", "deep"]
WarningLevel = Literal["info", "warning", "error"]
BookImportExtractMode = Literal["tail", "full"]
class BookImportWarning(BaseModel):
"""导入告警信息"""
code: str = Field(..., description="告警编码")
message: str = Field(..., description="告警内容")
level: WarningLevel = Field(default="warning", description="告警等级")
class ProjectSuggestion(BaseModel):
"""项目建议信息(可在预览页修改)"""
title: str = Field(..., min_length=1, max_length=200, description="项目标题")
description: Optional[str] = Field(None, description="项目简介")
theme: Optional[str] = Field(None, description="主题")
genre: Optional[str] = Field(None, description="类型")
narrative_perspective: str = Field(default="第三人称", description="叙事视角")
target_words: int = Field(default=100000, ge=1000, description="目标字数(默认10万字)")
class BookImportChapter(BaseModel):
"""预览章节"""
title: str = Field(..., min_length=1, max_length=200, description="章节标题")
content: str = Field(default="", description="章节正文")
summary: Optional[str] = Field(None, description="章节摘要")
chapter_number: int = Field(..., ge=1, description="章节序号")
outline_title: Optional[str] = Field(None, description="关联大纲标题(可选)")
class BookImportOutline(BaseModel):
"""预览大纲"""
title: str = Field(..., min_length=1, max_length=200, description="大纲标题")
content: Optional[str] = Field(None, description="大纲内容")
order_index: int = Field(..., ge=1, description="排序序号")
structure: Optional[dict[str, Any]] = Field(None, description="结构化大纲(与系统大纲生成结构一致)")
class BookImportTaskCreateRequest(BaseModel):
"""创建拆书任务请求"""
extract_mode: BookImportExtractMode = Field(default="tail", description="提取范围:tail=截取末章,full=整本")
tail_chapter_count: int = Field(default=10, ge=5, le=9999, description="当 extract_mode=tail 时,截取末尾章节数;需为5的倍数,超过50将按整本处理")
class BookImportTaskCreateResponse(BaseModel):
"""创建任务响应"""
task_id: str
status: TaskStatus
class BookImportTaskStatusResponse(BaseModel):
"""任务状态响应"""
task_id: str
status: TaskStatus
progress: int = Field(..., ge=0, le=100)
message: Optional[str] = None
error: Optional[str] = None
created_at: datetime
updated_at: datetime
class BookImportPreviewResponse(BaseModel):
"""预览数据响应"""
task_id: str
project_suggestion: ProjectSuggestion
chapters: list[BookImportChapter]
outlines: list[BookImportOutline]
warnings: list[BookImportWarning]
class BookImportApplyRequest(BaseModel):
"""确认导入请求(支持前端修订后的数据)"""
project_suggestion: ProjectSuggestion
chapters: list[BookImportChapter]
outlines: list[BookImportOutline] = Field(default_factory=list)
import_mode: ImportMode = Field(default="append", description="导入模式")
class BookImportApplyResponse(BaseModel):
"""确认导入响应"""
success: bool
project_id: str
statistics: dict[str, int]
warnings: list[BookImportWarning] = Field(default_factory=list)
class BookImportRetryRequest(BaseModel):
"""重试失败步骤请求"""
steps: list[str] = Field(..., min_length=1, description="需要重试的步骤名列表,如 world_building / career_system / characters")