Files
未来 17e78955a9 fix: MCP插件TimeoutError修复 + 多项Bug修复和性能优化
- fix: MCP插件管理接口改为后台任务,修复TimeoutError
- fix: MCP连接失败后上下文清理的cancel scope错误
- feat: MCP插件后台注册添加重试机制
- fix: 限制每章自动创建伏笔数量上限
- fix: 修复JSON非法转义字符清洗
- fix: SSE流式生成添加心跳保活
- fix: 职业生成改用POST请求避免URL长度限制
- perf: 使用torch CPU版本加速Docker构建
- fix: 自动修复JSON字符串值中的裸换行符
- feat: 集成json5容错解析器
2026-04-26 13:58:15 +08:00

155 lines
6.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""职业相关的Pydantic模型"""
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional, List, Dict, Any
from datetime import datetime
class CareerStage(BaseModel):
"""职业阶段模型"""
level: int = Field(..., description="阶段等级")
name: str = Field(..., description="阶段名称")
description: Optional[str] = Field(None, description="阶段描述")
class CareerBase(BaseModel):
"""职业基础模型"""
name: str = Field(..., description="职业名称")
type: str = Field(..., description="职业类型: main(主职业)/sub(副职业)")
description: Optional[str] = Field(None, description="职业描述")
category: Optional[str] = Field(None, description="职业分类")
stages: List[CareerStage] = Field(..., description="职业阶段列表")
max_stage: int = Field(10, description="最大阶段数")
requirements: Optional[str] = Field(None, description="职业要求/限制")
special_abilities: Optional[str] = Field(None, description="特殊能力描述")
worldview_rules: Optional[str] = Field(None, description="世界观规则关联")
attribute_bonuses: Optional[Dict[str, str]] = Field(None, description="属性加成")
class CareerCreate(CareerBase):
"""创建职业的请求模型"""
project_id: str = Field(..., description="项目ID")
source: str = Field("manual", description="来源: ai/manual")
class CareerUpdate(BaseModel):
"""更新职业的请求模型"""
name: Optional[str] = None
type: Optional[str] = None
description: Optional[str] = None
category: Optional[str] = None
stages: Optional[List[CareerStage]] = None
max_stage: Optional[int] = None
requirements: Optional[str] = None
special_abilities: Optional[str] = None
worldview_rules: Optional[str] = None
attribute_bonuses: Optional[Dict[str, str]] = None
class CareerResponse(BaseModel):
"""职业响应模型"""
id: str
project_id: str
name: str
type: str
description: Optional[str] = None
category: Optional[str] = None
stages: List[CareerStage]
max_stage: int
requirements: Optional[str] = None
special_abilities: Optional[str] = None
worldview_rules: Optional[str] = None
attribute_bonuses: Optional[Dict[str, str]] = None
source: str
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
class CareerListResponse(BaseModel):
"""职业列表响应模型"""
total: int
main_careers: List[CareerResponse] = Field(default_factory=list, description="主职业列表")
sub_careers: List[CareerResponse] = Field(default_factory=list, description="副职业列表")
class CareerGenerateRequest(BaseModel):
"""AI生成职业体系的请求模型"""
project_id: str = Field(..., description="项目ID")
main_career_count: int = Field(5, description="主职业数量", ge=1, le=20)
sub_career_count: int = Field(8, description="副职业数量", ge=0, le=30)
user_requirements: str = Field("", description="用户额外要求")
enable_mcp: bool = Field(False, description="是否启用MCP工具增强")
# ===== 角色职业关联相关 =====
class CharacterCareerBase(BaseModel):
"""角色职业关联基础模型"""
career_id: str = Field(..., description="职业ID")
career_type: str = Field(..., description="main(主职业)/sub(副职业)")
current_stage: int = Field(1, description="当前阶段", ge=1)
stage_progress: int = Field(0, description="阶段内进度(0-100", ge=0, le=100)
started_at: Optional[str] = Field(None, description="开始修炼时间")
reached_current_stage_at: Optional[str] = Field(None, description="到达当前阶段时间")
notes: Optional[str] = Field(None, description="备注")
class CharacterCareerCreate(CharacterCareerBase):
"""创建角色职业关联的请求模型"""
character_id: str = Field(..., description="角色ID")
class CharacterCareerUpdate(BaseModel):
"""更新角色职业关联的请求模型"""
current_stage: Optional[int] = Field(None, ge=1)
stage_progress: Optional[int] = Field(None, ge=0, le=100)
reached_current_stage_at: Optional[str] = None
notes: Optional[str] = None
class CharacterCareerDetail(BaseModel):
"""角色职业详情模型(包含职业信息)"""
id: str
character_id: str
career_id: str
career_name: str = Field(..., description="职业名称")
career_type: str
current_stage: int
stage_name: str = Field(..., description="当前阶段名称")
stage_description: Optional[str] = Field(None, description="当前阶段描述")
stage_progress: int
max_stage: int = Field(..., description="该职业的最大阶段")
started_at: Optional[str] = None
reached_current_stage_at: Optional[str] = None
notes: Optional[str] = None
created_at: datetime
updated_at: datetime
class CharacterCareerResponse(BaseModel):
"""角色职业响应模型"""
main_career: Optional[CharacterCareerDetail] = Field(None, description="主职业")
sub_careers: List[CharacterCareerDetail] = Field(default_factory=list, description="副职业列表")
class SetMainCareerRequest(BaseModel):
"""设置主职业请求模型"""
career_id: str = Field(..., description="职业ID")
current_stage: int = Field(1, description="当前阶段", ge=1)
started_at: Optional[str] = Field(None, description="开始修炼时间")
class AddSubCareerRequest(BaseModel):
"""添加副职业请求模型"""
career_id: str = Field(..., description="职业ID")
current_stage: int = Field(1, description="当前阶段", ge=1)
started_at: Optional[str] = Field(None, description="开始修炼时间")
class UpdateCareerStageRequest(BaseModel):
"""更新职业阶段请求模型"""
current_stage: int = Field(..., description="新的阶段", ge=1)
stage_progress: int = Field(0, description="阶段进度", ge=0, le=100)
reached_current_stage_at: Optional[str] = Field(None, description="到达时间")
notes: Optional[str] = Field(None, description="备注")