Files
MuMuAINovel/backend/app/schemas/import_export.py
T

269 lines
8.5 KiB
Python

"""导入导出相关的Pydantic模型"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
class ExportOptions(BaseModel):
"""导出选项"""
include_generation_history: bool = Field(False, description="是否包含生成历史")
include_writing_styles: bool = Field(True, description="是否包含写作风格")
include_careers: bool = Field(True, description="是否包含职业系统")
include_memories: bool = Field(False, description="是否包含故事记忆(数据量可能较大)")
include_plot_analysis: bool = Field(False, description="是否包含剧情分析")
class ChapterExportData(BaseModel):
"""章节导出数据"""
title: str
content: Optional[str] = None
summary: Optional[str] = None
chapter_number: int
word_count: int = 0
status: str = "draft"
created_at: Optional[str] = None
# 大纲细化功能新增字段
outline_title: Optional[str] = None # 关联的大纲标题(用于导入时重建关联)
sub_index: Optional[int] = None # 大纲下的子章节序号
expansion_plan: Optional[Dict[str, Any]] = None # 展开规划详情(JSON对象)
class CharacterExportData(BaseModel):
"""角色导出数据"""
name: str
age: Optional[str] = None
gender: Optional[str] = None
is_organization: bool = False
role_type: Optional[str] = None
personality: Optional[str] = None
background: Optional[str] = None
appearance: Optional[str] = None
relationships: Optional[str] = None
traits: Optional[List[str]] = None
organization_type: Optional[str] = None
organization_purpose: Optional[str] = None
organization_members: Optional[str] = None
avatar_url: Optional[str] = None
main_career_id: Optional[str] = None
main_career_stage: Optional[int] = None
sub_careers: Optional[str] = None
# 组织专属字段
power_level: Optional[int] = None
location: Optional[str] = None
motto: Optional[str] = None
color: Optional[str] = None
created_at: Optional[str] = None
class OutlineExportData(BaseModel):
"""大纲导出数据"""
title: str
content: Optional[str] = None
structure: Optional[str] = None
order_index: Optional[int] = None
created_at: Optional[str] = None
class RelationshipExportData(BaseModel):
"""关系导出数据"""
source_name: str
target_name: str
relationship_name: Optional[str] = None
intimacy_level: int = 50
status: str = "active"
description: Optional[str] = None
started_at: Optional[str] = None
class OrganizationExportData(BaseModel):
"""组织详情导出数据"""
character_name: str
parent_org_name: Optional[str] = None
power_level: int = 50
member_count: int = 0
location: Optional[str] = None
motto: Optional[str] = None
color: Optional[str] = None
class OrganizationMemberExportData(BaseModel):
"""组织成员导出数据"""
organization_name: str
character_name: str
position: str
rank: int = 0
status: str = "active"
joined_at: Optional[str] = None
loyalty: int = 50
contribution: int = 0
notes: Optional[str] = None
class WritingStyleExportData(BaseModel):
"""写作风格导出数据"""
name: str
style_type: str
preset_id: Optional[str] = None
description: Optional[str] = None
prompt_content: str
order_index: int = 0
class GenerationHistoryExportData(BaseModel):
"""生成历史导出数据"""
chapter_title: Optional[str] = None
prompt: Optional[str] = None
generated_content: Optional[str] = None
model: Optional[str] = None
tokens_used: Optional[int] = None
generation_time: Optional[float] = None
created_at: Optional[str] = None
class CareerExportData(BaseModel):
"""职业导出数据"""
name: str
type: str # main/sub
description: Optional[str] = None
category: Optional[str] = None
stages: str # JSON格式的阶段列表
max_stage: int = 10
requirements: Optional[str] = None
special_abilities: Optional[str] = None
worldview_rules: Optional[str] = None
attribute_bonuses: Optional[str] = None
source: str = "ai"
created_at: Optional[str] = None
class CharacterCareerExportData(BaseModel):
"""角色职业关联导出数据"""
character_name: str # 通过名称关联
career_name: str # 通过名称关联
career_type: str # main/sub
current_stage: int = 1
stage_progress: int = 0
started_at: Optional[str] = None
reached_current_stage_at: Optional[str] = None
notes: Optional[str] = None
class StoryMemoryExportData(BaseModel):
"""故事记忆导出数据"""
chapter_title: Optional[str] = None # 通过章节标题关联
memory_type: str
title: Optional[str] = None
content: str
full_context: Optional[str] = None
related_characters: Optional[List[str]] = None # 角色名称列表
related_locations: Optional[List[str]] = None
tags: Optional[List[str]] = None
importance_score: float = 0.5
story_timeline: int
chapter_position: int = 0
text_length: int = 0
is_foreshadow: int = 0
foreshadow_strength: Optional[float] = None
created_at: Optional[str] = None
class PlotAnalysisExportData(BaseModel):
"""剧情分析导出数据"""
chapter_title: str # 通过章节标题关联
plot_stage: Optional[str] = None
conflict_level: Optional[int] = None
conflict_types: Optional[List[str]] = None
emotional_tone: Optional[str] = None
emotional_intensity: Optional[float] = None
emotional_curve: Optional[Dict[str, float]] = None
hooks: Optional[List[Dict[str, Any]]] = None
hooks_count: int = 0
hooks_avg_strength: Optional[float] = None
foreshadows: Optional[List[Dict[str, Any]]] = None
foreshadows_planted: int = 0
foreshadows_resolved: int = 0
plot_points: Optional[List[Dict[str, Any]]] = None
plot_points_count: int = 0
character_states: Optional[List[Dict[str, Any]]] = None
scenes: Optional[List[Dict[str, Any]]] = None
pacing: Optional[str] = None
overall_quality_score: Optional[float] = None
pacing_score: Optional[float] = None
engagement_score: Optional[float] = None
coherence_score: Optional[float] = None
analysis_report: Optional[str] = None
suggestions: Optional[List[str]] = None
word_count: Optional[int] = None
dialogue_ratio: Optional[float] = None
description_ratio: Optional[float] = None
created_at: Optional[str] = None
class ProjectDefaultStyleExportData(BaseModel):
"""项目默认风格导出数据"""
style_name: str # 通过风格名称关联
class ProjectExportData(BaseModel):
"""项目完整导出数据"""
version: str = "1.1.0" # 升级版本号
export_time: str
project: Dict[str, Any]
chapters: List[ChapterExportData] = []
characters: List[CharacterExportData] = []
outlines: List[OutlineExportData] = []
relationships: List[RelationshipExportData] = []
organizations: List[OrganizationExportData] = []
organization_members: List[OrganizationMemberExportData] = []
writing_styles: List[WritingStyleExportData] = []
generation_history: List[GenerationHistoryExportData] = []
# 新增字段
careers: List[CareerExportData] = []
character_careers: List[CharacterCareerExportData] = []
story_memories: List[StoryMemoryExportData] = []
plot_analysis: List[PlotAnalysisExportData] = []
project_default_style: Optional[ProjectDefaultStyleExportData] = None
class ImportValidationResult(BaseModel):
"""导入验证结果"""
valid: bool
version: str
project_name: Optional[str] = None
statistics: Dict[str, int] = {}
errors: List[str] = []
warnings: List[str] = []
class ImportResult(BaseModel):
"""导入结果"""
success: bool
project_id: Optional[str] = None
message: str
statistics: Dict[str, int] = {}
details: Optional[Dict[str, List[str]]] = None
warnings: List[str] = []
class CharactersExportRequest(BaseModel):
"""角色/组织批量导出请求"""
character_ids: List[str] = Field(..., description="要导出的角色/组织ID列表")
class CharactersExportData(BaseModel):
"""角色/组织批量导出数据"""
version: str = "1.0.0"
export_time: str
export_type: str = "characters"
count: int
data: List[CharacterExportData]
class CharactersImportResult(BaseModel):
"""角色/组织导入结果"""
success: bool
message: str
statistics: Dict[str, int]
details: Dict[str, List[str]]
warnings: List[str] = []