"""导入导出相关的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] = []