2026-01-26 18:26:20 +08:00

196 lines
5.4 KiB
Python

"""
项目管理数据模型
Series Project - 剧集项目的完整数据结构
"""
from pydantic import BaseModel, Field
from typing import Dict, List, Optional, Any, TYPE_CHECKING
from datetime import datetime
from enum import Enum
# Use TYPE_CHECKING to avoid circular imports
if TYPE_CHECKING:
from app.models.review import ReviewConfig, ReviewResult
# ============================================
# 枚举类型
# ============================================
class TaskType(str, Enum):
"""任务类型枚举"""
DIALOGUE = "dialogue" # 对话创作
REVIEW = "review" # 内容审核
OUTLINE = "outline" # 大纲生成
STRUCTURE = "structure" # 结构分析
SCENE = "scene" # 场景描写
CONSISTENCY = "consistency" # 一致性检查
# ============================================
# 嵌套模型
# ============================================
class CharacterProfile(BaseModel):
"""人物小传"""
name: str
description: str = ""
personality: str = ""
speechStyle: str = ""
currentState: str = ""
relationships: Dict[str, str] = Field(default_factory=dict)
appearance: Optional[str] = None
class SceneSetting(BaseModel):
"""场景设定"""
name: str
description: str = ""
atmosphere: str = ""
class GlobalContext(BaseModel):
"""全局上下文"""
worldSetting: str = ""
characterProfiles: Dict[str, CharacterProfile] = Field(default_factory=dict)
sceneSettings: Dict[str, SceneSetting] = Field(default_factory=dict)
overallOutline: str = ""
styleGuide: str = ""
uploadedScript: str = "" # 上传的剧本内容
inspiration: str = "" # 创意灵感内容
class Memory(BaseModel):
"""记忆系统"""
eventTimeline: List[Dict[str, Any]] = Field(default_factory=list)
pendingThreads: List[Dict[str, Any]] = Field(default_factory=list)
foreshadowing: List[Dict[str, Any]] = Field(default_factory=list)
characterStates: Dict[str, List[Dict[str, Any]]] = Field(default_factory=dict)
class SkillSetting(BaseModel):
"""Skill 设置(保留用于兼容)"""
enabled: bool = True
parameterOverrides: Optional[Dict[str, Any]] = None
class SkillAssignment(BaseModel):
"""Skill 分配配置"""
skill_id: str
enabled: bool = True
priority: int = 0
parameter_overrides: Optional[Dict[str, Any]] = None
class TaskSkillConfig(BaseModel):
"""任务级 Skill 配置"""
task_type: TaskType
skills: List[SkillAssignment] = Field(default_factory=list)
class EpisodeSkillOverride(BaseModel):
"""单集 Skill 覆盖配置"""
episode_number: int
task_configs: List[TaskSkillConfig] = Field(default_factory=list)
use_project_default: bool = True
class EpisodeIssue(BaseModel):
"""剧集问题"""
type: str
description: str
severity: str # low, medium, high
suggestion: str = ""
# ============================================
# 核心模型
# ============================================
class SeriesProject(BaseModel):
"""剧集项目模型"""
id: str = ""
name: str
type: str = "series"
agentId: str = "series-creation"
mode: str = "batch" # auto, batch, step
# 全局上下文
globalContext: GlobalContext = Field(default_factory=GlobalContext)
# 记忆系统
memory: Memory = Field(default_factory=Memory)
# 配置
totalEpisodes: int = 30
# 三级 Skills 配置
defaultTaskSkills: List[TaskSkillConfig] = Field(default_factory=list)
episodeSkillOverrides: Dict[int, EpisodeSkillOverride] = Field(default_factory=dict)
# 保留现有字段用于兼容
skillSettings: Dict[str, SkillSetting] = Field(default_factory=dict)
autoRetryConfig: Optional[Dict[str, Any]] = None
# 审核配置
reviewConfig: Optional[Dict[str, Any]] = None
# 时间戳
createdAt: datetime = Field(default_factory=datetime.now)
updatedAt: datetime = Field(default_factory=datetime.now)
class Episode(BaseModel):
"""单集模型"""
id: str = ""
projectId: str = ""
number: int = 0
title: str = ""
status: str = "pending" # pending, writing, review, completed, needs-review
# 内容
structure: Optional[Dict[str, Any]] = None
outline: Optional[str] = None
content: Optional[str] = None
summary: Optional[str] = None
# 质量信息
qualityScore: Optional[float] = None
retryCount: int = 0
issues: List[EpisodeIssue] = Field(default_factory=list)
# 审核结果
reviewResult: Optional[Dict[str, Any]] = None
# 时间戳
createdAt: datetime = Field(default_factory=datetime.now)
completedAt: Optional[datetime] = None
# ============================================
# 请求/响应模型
# ============================================
class SeriesProjectCreate(BaseModel):
"""创建项目请求"""
name: str
totalEpisodes: int = 30
agentId: str = "series-creation"
mode: str = "batch"
globalContext: GlobalContext = Field(default_factory=GlobalContext)
skillSettings: Dict[str, SkillSetting] = Field(default_factory=dict)
class EpisodeExecuteRequest(BaseModel):
"""执行剧集请求"""
episodeNumber: int
title: str = ""
contextOverrides: Optional[Dict[str, Any]] = None
class EpisodeExecuteResponse(BaseModel):
"""执行剧集响应"""
episode: Episode
success: bool
message: str = ""