2218 lines
87 KiB
Python
2218 lines
87 KiB
Python
"""提示词管理服务"""
|
||
from typing import Dict, Any, Optional
|
||
import json
|
||
|
||
|
||
class WritingStyleManager:
|
||
"""写作风格管理器"""
|
||
|
||
# 预设风格配置
|
||
PRESET_STYLES = {
|
||
"natural": {
|
||
"name": "自然沉浸 (Natural & Immersive)",
|
||
"description": "祛除翻译腔,强调生活质感,像呼吸一样自然的叙事",
|
||
"prompt_content": """
|
||
### 核心指令:自然沉浸风格
|
||
请模拟人类作家在放松状态下的写作,通过以下规则消除“AI味”:
|
||
|
||
1. **拒绝翻译腔与书面化**:
|
||
- 严禁使用“一种...的感觉”、“随着...”、“与此同时”等连接词。
|
||
- 多用短句和“流水句”,模拟人类视线的移动和思维的跳跃。
|
||
- 口语化叙述,但不要滥用语气词,而是通过句子的长短节奏来体现语气。
|
||
|
||
2. **生活化的颗粒度**:
|
||
- 描写不要宏大,要聚焦在具体的、微小的生活细节(如:杯子上的水渍、衣服的褶皱)。
|
||
- 允许逻辑上的适度“松散”,不要让每句话都像说明书一样严丝合缝。
|
||
|
||
3. **具体的“展示”**:
|
||
- 不要写“他很生气”,要写他“把烟头按灭在还没吃完的米饭里”。
|
||
- 避免使用抽象的形容词(如:巨大的、美丽的、悲伤的),必须用名词和动词来承载画面。
|
||
"""
|
||
},
|
||
"classical": {
|
||
"name": "古典雅致 (Classical & Elegant)",
|
||
"description": "白话文与古典韵味的结合,强调留白与炼字",
|
||
"prompt_content": """
|
||
### 核心指令:古典雅致风格
|
||
请模仿民国时期或古典白话小说的笔触,构建端庄且富有余味的叙事:
|
||
|
||
1. **炼字与韵律**:
|
||
- 尽量使用双音节词或四字短语,但严禁堆砌辞藻。
|
||
- 注重句子的声调韵律,读起来要有金石之声或流水之韵。
|
||
- 适当使用倒装句或定语后置,增加古雅感。
|
||
|
||
2. **克制的修辞**:
|
||
- 少用现代的比喻(如“像机器一样”),多用取自自然的比喻(如“如风过林”)。
|
||
- **意在言外**:不要把话说透,留三分余地。写景即是写情,不要将情感直接剖白。
|
||
|
||
3. **禁忌**:
|
||
- 严禁使用现代科技词汇(除非题材需要)、网络用语或过于西化的句式(如长定语从句)。
|
||
- 避免滥用“之乎者也”,追求的是“神似”而非生硬的半文半白。
|
||
"""
|
||
},
|
||
"modern": {
|
||
"name": "冷硬现代 (Modern & Hard-boiled)",
|
||
"description": "海明威式的冰山理论,节奏极快,零度情感",
|
||
"prompt_content": """
|
||
### 核心指令:冷硬现代风格
|
||
请采用“极简主义”和“零度写作”手法,去除所有矫饰:
|
||
|
||
1. **冰山理论**:
|
||
- **只写动作和对话,完全剔除心理描写和形容词堆砌。**
|
||
- 不要告诉读者角色感觉如何,通过角色的反应和环境的冷峻反馈来体现。
|
||
|
||
2. **电影蒙太奇节奏**:
|
||
- 句子要短、脆、硬。像手术刀一样切开场景。
|
||
- 段落之间快速切换,不要用过渡句连接,直接跳切。
|
||
|
||
3. **高信息密度**:
|
||
- 删除所有废话。如果一个词删掉不影响理解,就删掉它。
|
||
- 多用名词和强动词(Strong Verbs),少用副词(Adverbs)。例如:不要写“他重重地关上门”,写“他摔上了门”。
|
||
"""
|
||
},
|
||
"poetic": {
|
||
"name": "意识流 (Stream of Consciousness)",
|
||
"description": "注重感官通感与内心独白,打破现实与幻想的边界",
|
||
"prompt_content": """
|
||
### 核心指令:意识流/诗意风格
|
||
请侧重于主观感受的流动,而非客观事实的记录:
|
||
|
||
1. **通感与陌生化**:
|
||
- 打通五感(如:听到了颜色的声音,闻到了悲伤的气味)。
|
||
- 使用“陌生化”的语言,把熟悉的事物写得陌生,迫使读者重新审视。
|
||
|
||
2. **情绪的具象化**:
|
||
- **绝对禁止**直接出现“开心”、“痛苦”等抽象词汇。
|
||
- 必须寻找“客观对应物”(Objective Correlative),将情绪投射到具体的景物上(如:生锈的铁轨、发霉的橘子)。
|
||
|
||
3. **流动的句式**:
|
||
- 句子可以很长,包含多重意象的叠加。
|
||
- 允许思维的非线性跳跃,模拟梦境或深层潜意识的逻辑。
|
||
"""
|
||
},
|
||
"concise": {
|
||
"name": "白描速写 (Sketch & Concise)",
|
||
"description": "只有骨架的叙事,强调绝对的精准和功能性",
|
||
"prompt_content": """
|
||
### 核心指令:白描速写风格
|
||
请像速写画家一样,只勾勒线条,不涂抹色彩:
|
||
|
||
1. **功能性第一**:
|
||
- 每一句话必须推动情节,或者揭示关键信息。
|
||
- 如果一句话只是为了渲染气氛,删掉它。
|
||
|
||
2. **主谓宾结构**:
|
||
- 尽量使用简单的主谓宾结构,减少修饰语。
|
||
- 避免复杂的从句和嵌套结构。
|
||
|
||
3. **直击核心**:
|
||
- 对话直接进入主题,去除寒暄和废话。
|
||
- 环境描写仅限于对情节有物理影响的物体(如:挡路的石头、藏在桌下的枪)。
|
||
"""
|
||
},
|
||
"vivid": {
|
||
"name": "感官特写 (Sensory & Vivid)",
|
||
"description": "高分辨率的描写,强调材质、光影和微观细节",
|
||
"prompt_content": """
|
||
### 核心指令:感官特写风格
|
||
请将镜头推到特写级别(Macro Lens),捕捉常人忽略的细节:
|
||
|
||
1. **反套路细节**:
|
||
- 不要写大众化的细节(如:蓝天白云),要写具有**独特性**的细节(如:云层边缘那抹像淤青一样的灰紫色)。
|
||
- 关注物体的**质感(Texture)**:粗糙的、粘稠的、冰凉的、颗粒感的。
|
||
|
||
2. **动态捕捉**:
|
||
- 不要写静止的画面,要写光影的流变、灰尘的飞舞、肌肉的抽动。
|
||
- 让读者产生生理性的反应(如:痛感、饥饿感、窒息感)。
|
||
|
||
3. **禁用词汇**:
|
||
- 禁止使用“映入眼帘”、“宛如画卷”等陈词滥调。
|
||
- 必须用具体的动词带动感官描写。
|
||
"""
|
||
}
|
||
}
|
||
|
||
@classmethod
|
||
def get_preset_style(cls, preset_id: str) -> Optional[Dict[str, str]]:
|
||
"""获取预设风格配置"""
|
||
return cls.PRESET_STYLES.get(preset_id)
|
||
|
||
@classmethod
|
||
def get_all_presets(cls) -> Dict[str, Dict[str, str]]:
|
||
"""获取所有预设风格"""
|
||
return cls.PRESET_STYLES
|
||
|
||
@staticmethod
|
||
def apply_style_to_prompt(base_prompt: str, style_content: str) -> str:
|
||
"""
|
||
将写作风格应用到基础提示词中
|
||
|
||
Args:
|
||
base_prompt: 基础提示词
|
||
style_content: 风格要求内容
|
||
|
||
Returns:
|
||
组合后的提示词
|
||
"""
|
||
# 在基础提示词末尾添加风格要求
|
||
return f"{base_prompt}\n\n{style_content}\n\n请直接输出章节正文内容,不要包含章节标题和其他说明文字。"
|
||
|
||
|
||
class PromptService:
|
||
"""提示词模板管理"""
|
||
|
||
# 世界构建提示词
|
||
WORLD_BUILDING = """你是一位资深的世界观设计师。基于以下输入信息,构建一个高度原创、深度自洽、充满戏剧冲突的小说世界观。
|
||
|
||
# 输入信息
|
||
书名:{title}
|
||
主题:{theme}
|
||
类型:{genre}
|
||
简介:{description}
|
||
|
||
# 核心要求
|
||
* **简介契合性**:世界观设定必须能够支撑简介中描述的故事情节和核心矛盾
|
||
* **类型适配性**:世界观必须符合小说类型的特征,不要生成不匹配的设定
|
||
* **主题贴合性**:时代背景要能有效支撑和体现小说主题
|
||
* **原创性**:在类型框架内发挥创意,创造独特但合理的世界设定
|
||
* **具象化**:避免空洞概念,用具体可感的细节描述世界
|
||
* **逻辑自洽**:确保所有设定相互支撑,形成完整体系
|
||
* **戏剧张力**:设定要能为故事冲突提供支撑,尤其要为简介中的故事线索创造合适的环境
|
||
|
||
# 类型指导原则
|
||
根据小说类型选择适当的设定风格:
|
||
|
||
**现代都市/言情/青春**:
|
||
- 时间设定:当代现实社会(2020年代)或近未来(2030-2050年)
|
||
- 避免使用:大崩解、纪元、末日、重生等宏大概念
|
||
- 重点描述:具体的城市环境、社会现状、文化氛围
|
||
- 例如:一线城市的竞争压力、职场文化、代际冲突、社交媒体影响等
|
||
|
||
**历史/古代**:
|
||
- 时间设定:明确的历史朝代或虚构但有历史感的古代社会
|
||
- 避免使用:科技元素、未来概念
|
||
- 重点描述:时代特征、礼教制度、阶级分化
|
||
|
||
**玄幻/仙侠/修真**:
|
||
- 时间设定:修炼文明的特定时期,可以有门派兴衰、修炼体系变革
|
||
- 可以使用宏大设定,但要与修炼体系紧密结合
|
||
- 重点描述:修炼规则、灵气环境、门派势力
|
||
|
||
**科幻**:
|
||
- 时间设定:未来某个明确时期(如2150年、星际时代初期等)
|
||
- 可以有文明转折,但要具体说明科技水平和社会形态
|
||
- 避免空泛的纪元名称,多用具体的科技特征描述
|
||
|
||
**奇幻/魔法**:
|
||
- 时间设定:魔法文明的特定阶段
|
||
- 重点描述:魔法体系、种族关系、大陆格局
|
||
|
||
**悬疑/推理/惊悚**:
|
||
- 时间设定:当代或历史某个时期
|
||
- 重点描述:案件背景、社会环境、人际关系网
|
||
|
||
**军事/战争**:
|
||
- 时间设定:战争时期的具体年代
|
||
- 重点描述:战争形势、阵营对立、军事科技水平
|
||
|
||
# 设定尺度控制
|
||
**切记:不要为所有类型都生成宏大的世界观!**
|
||
|
||
- 如果是现代都市题材,就写现实社会的某个城市、某个行业、某个阶层
|
||
- 如果是校园青春,就写学校环境、学生生活、成长困境
|
||
- 如果是职场言情,就写公司文化、行业特点、职业压力
|
||
- 只有史诗级题材(玄幻、科幻、奇幻等)才需要宏大的世界观架构
|
||
|
||
# 输出要求
|
||
生成包含以下四个字段的JSON对象,每个字段用300-500字的连贯段落描述:
|
||
|
||
1. **time_period**(时间背景与社会状态)
|
||
- **重要**:根据类型和主题,设定合适规模的时间背景
|
||
- 现代题材:描述当前社会的具体特征(如:2024年的北京,互联网行业高速发展...)
|
||
- 历史题材:明确朝代和历史阶段(如:明朝嘉靖年间,海禁政策下的沿海地区...)
|
||
- 幻想题材:描述文明发展阶段,但要具体而非空泛(如:大陆诸国林立的战国时代,而非"XX纪元")
|
||
- 阐明时代核心矛盾和社会焦虑(要贴合主题)
|
||
|
||
2. **location**(空间环境与地理特征)
|
||
- 描绘故事主要发生的空间环境(具体的城市、地区、场所)
|
||
- 现代题材:具体城市名或城市类型(一线城市、沿海城市、内陆小城等)
|
||
- 说明环境如何影响居民的生存方式
|
||
- 刻画能代表世界独特性的标志性场景
|
||
|
||
3. **atmosphere**(感官体验与情感基调)
|
||
- 描述身临其境的感官细节(视觉、听觉、嗅觉等)
|
||
- 阐述世界的美学风格和色彩基调
|
||
- 刻画居民普遍的心理状态和情绪氛围
|
||
- **要与主题情感呼应**(如竞争焦虑、成长迷茫、爱情憧憬等)
|
||
|
||
4. **rules**(世界规则与社会结构)
|
||
- 阐明世界运行的核心法则和底层逻辑
|
||
- 现代题材:社会规则、行业潜规则、人际交往法则
|
||
- 幻想题材:力量体系、社会等级、资源分配
|
||
- 描述权力结构和利益格局
|
||
- 揭示社会禁忌及违反后的后果
|
||
|
||
# 格式规范
|
||
1. **纯JSON输出**:只输出JSON对象,以左花括号开始、右花括号结束
|
||
2. **无额外标记**:不要包含markdown标记、代码块符号或任何说明文字
|
||
3. **纯文本值**:每个字段值必须是完整的段落文本,不使用嵌套结构
|
||
4. **无特殊符号**:文本中不使用引号、方括号等特殊符号包裹内容
|
||
5. **丰富细节**:每个字段提供充实的原创内容,避免模板化表达
|
||
|
||
请根据输入的书名、类型、主题和简介,生成**规模适当、风格匹配、能够支撑故事发展**的世界观设定。
|
||
|
||
**特别提醒**:
|
||
- 简介是故事的核心概括,世界观必须为简介中描述的情节提供合理的发生背景
|
||
- 所有设定都应该能够自然地承载简介中的故事线
|
||
- 如果简介中有特定的场景、冲突或设定,世界观要与之呼应
|
||
|
||
# JSON格式示例
|
||
|
||
{{
|
||
"time_period": "时间背景与社会状态的详细描述(300-500字)",
|
||
"location": "空间环境与地理特征的详细描述(300-500字)",
|
||
"atmosphere": "感官体验与情感基调的详细描述(300-500字)",
|
||
"rules": "世界规则与社会结构的详细描述(300-500字)"
|
||
}}"""
|
||
|
||
# 批量角色生成提示词
|
||
CHARACTERS_BATCH_GENERATION = """你是一位专业的角色设定师。请根据以下世界观和要求,生成{count}个立体丰满的角色和组织:
|
||
|
||
世界观信息:
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
主题:{theme}
|
||
类型:{genre}
|
||
特殊要求:{requirements}
|
||
|
||
【数量要求 - 必须严格遵守】
|
||
请精确生成{count}个实体,不多不少。数组中必须包含且仅包含{count}个对象。
|
||
|
||
实体类型分配:
|
||
- 至少1个主角(protagonist)
|
||
- 多个配角(supporting)
|
||
- 可以包含反派(antagonist)
|
||
- 可以包含1-2个**高影响力的重要组织**(势力等级应在70-95之间)
|
||
|
||
要求:
|
||
- 角色要符合世界观设定
|
||
- 性格和背景要有深度
|
||
- 角色之间要有关系网络
|
||
- 组织要有存在的合理性
|
||
- 所有实体要为故事服务
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON数组格式,不要包含任何markdown标记、代码块标记或其他说明文字
|
||
2. JSON字符串值的内容描述中严禁使用任何特殊符号(包括中文引号、英文引号、方括号、书名号等)
|
||
3. 所有专有名词、地点、人物、组织名称等直接书写,不使用任何符号包裹
|
||
|
||
请严格按照以下JSON数组格式返回(每个角色为数组中的一个对象):
|
||
[
|
||
{{
|
||
"name": "角色姓名",
|
||
"age": 25,
|
||
"gender": "男/女/其他",
|
||
"is_organization": false,
|
||
"role_type": "protagonist/supporting/antagonist",
|
||
"personality": "性格特点的详细描述(100-200字),包括核心性格、优缺点、特殊习惯",
|
||
"background": "背景故事的详细描述(100-200字),包括家庭背景、成长经历、重要转折",
|
||
"appearance": "外貌描述(50-100字),包括身高、体型、面容、着装风格",
|
||
"traits": ["特长1", "特长2", "特长3"],
|
||
"relationships_array": [
|
||
{{
|
||
"target_character_name": "已生成的角色名称",
|
||
"relationship_type": "关系类型(师父/朋友/敌人/父亲/母亲等)",
|
||
"intimacy_level": 75,
|
||
"description": "关系描述"
|
||
}}
|
||
],
|
||
"organization_memberships": [
|
||
{{
|
||
"organization_name": "已生成的组织名称",
|
||
"position": "职位",
|
||
"rank": 5,
|
||
"loyalty": 80
|
||
}}
|
||
]
|
||
}},
|
||
{{
|
||
"name": "组织名称",
|
||
"is_organization": true,
|
||
"role_type": "supporting",
|
||
"personality": "组织特性描述(100-200字),包括运作方式、核心理念、行事风格",
|
||
"background": "组织背景(100-200字),包括建立历史、发展历程、重要事件",
|
||
"appearance": "组织外在表现(50-100字),如总部位置、标志性建筑等",
|
||
"organization_type": "组织类型",
|
||
"organization_purpose": "组织目的",
|
||
"organization_members": ["成员1", "成员2"],
|
||
"power_level": 85,
|
||
"location": "组织所在地或主要活动区域",
|
||
"motto": "组织格言、口号或宗旨",
|
||
"color": "组织代表颜色(如:深红色、金色、黑色等)",
|
||
"traits": []
|
||
}}
|
||
]
|
||
|
||
**组织生成要求(重要):**
|
||
- 组织必须是对故事有重大影响的势力
|
||
- power_level应在70-95之间(高影响力组织)
|
||
- 不要生成无关紧要的小组织或普通社团
|
||
- 组织应该是推动剧情发展的关键力量
|
||
- 可以是正派势力、中立势力或反派势力,但一定要有存在感
|
||
|
||
**关系类型参考(从中选择或自定义):**
|
||
- 家族:父亲、母亲、兄弟、姐妹、子女、配偶、恋人
|
||
- 社交:师父、徒弟、朋友、同学、同事、邻居、知己
|
||
- 职业:上司、下属、合作伙伴
|
||
- 敌对:敌人、仇人、竞争对手、宿敌
|
||
|
||
**重要说明:**
|
||
1. **数量控制**:数组中必须精确包含{count}个对象,不能多也不能少
|
||
2. **关系约束**:relationships_array只能引用本批次中已经出现的角色名称
|
||
3. **组织约束**:organization_memberships只能引用本批次中is_organization=true的实体名称
|
||
4. **禁止幻觉**:不要引用任何不存在的角色或组织,如果没有可引用的就留空数组[]
|
||
5. **数值范围约束**:
|
||
- intimacy_level:-100到100的整数(负值表示敌对仇恨关系)
|
||
- loyalty:0到100的整数
|
||
- **rank:0到10的整数**(职位等级,0最低,10最高)
|
||
6. 角色之间要形成合理的关系网络
|
||
|
||
**示例说明**:
|
||
- 如果生成了角色A、组织B、角色C,则角色A的organization_memberships只能是[组织B],不能是其他组织
|
||
- 如果角色A在数组第一位,它的relationships_array必须为空[],因为还没有其他角色
|
||
- 如果角色C在数组第三位,它的relationships_array可以引用角色A,但不能引用不存在的角色D
|
||
|
||
再次强调:
|
||
1. 只返回纯JSON数组,不要有```json```这样的标记
|
||
2. 数组中必须精确包含{count}个对象
|
||
3. 不要引用任何本批次中不存在的角色或组织名称
|
||
4. 所有内容描述中严禁使用任何特殊符号,包括但不限于中文引号、英文引号、方括号、书名号等"""
|
||
|
||
# 向导大纲生成提示词
|
||
OUTLINE_CREATE = """你是一位经验丰富的小说作家和编剧。请根据以下信息为小说生成**开篇{chapter_count}章**的大纲:
|
||
|
||
【重要说明】
|
||
本次任务是为项目初始化生成开头部分的大纲,而不是整本书的完整大纲。这些章节应该:
|
||
- 完成故事的**开局设定**和**世界观展示**
|
||
- 引入主要角色,建立初始关系
|
||
- 埋下核心矛盾和悬念钩子
|
||
- 为后续剧情发展打下基础
|
||
- **不需要完整的故事闭环**,结尾应该为续写留出空间
|
||
|
||
基本信息:
|
||
- 书名:{title}
|
||
- 主题:{theme}
|
||
- 类型:{genre}
|
||
- 开篇章节数:{chapter_count}
|
||
- 叙事视角:{narrative_perspective}
|
||
- 全书目标字数:{target_words}
|
||
|
||
世界观:
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
角色信息:
|
||
{characters_info}
|
||
|
||
{mcp_references}
|
||
|
||
其他要求:{requirements}
|
||
|
||
开篇大纲要求:
|
||
- **开局设定**:前几章完成世界观呈现、主角登场、初始状态建立
|
||
- **矛盾引入**:引出核心冲突或故事主线,但不急于展开
|
||
- **角色亮相**:主要角色依次登场,展示性格特点和相互关系
|
||
- **节奏控制**:开篇不宜过快,给读者适应和代入的时间
|
||
- **悬念设置**:埋下伏笔和钩子,为后续续写大纲预留发展空间
|
||
- **视角统一**:采用{narrative_perspective}视角叙事
|
||
- **留白艺术**:结尾不要收束过紧,要为后续剧情留出足够的发展空间
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON数组格式,不要包含任何markdown标记、代码块标记或其他说明文字
|
||
2. JSON字符串值的内容描述中严禁使用任何特殊符号(包括中文引号、英文引号、方括号、书名号等)
|
||
3. 所有专有名词、事件名等直接书写,不使用任何符号包裹
|
||
|
||
请严格按照以下JSON数组格式返回(共{chapter_count}个章节对象):
|
||
[
|
||
{{
|
||
"chapter_number": 1,
|
||
"title": "章节标题",
|
||
"summary": "章节概要的详细描述(100-200字),包含主要情节、冲突、转折等",
|
||
"scenes": ["场景1描述", "场景2描述", "场景3描述"],
|
||
"characters": ["角色1", "角色2"],
|
||
"key_points": ["情节要点1", "情节要点2"],
|
||
"emotion": "本章情感基调",
|
||
"goal": "本章叙事目标"
|
||
}},
|
||
{{
|
||
"chapter_number": 2,
|
||
"title": "章节标题",
|
||
"summary": "章节概要...",
|
||
"scenes": ["场景1", "场景2"],
|
||
"characters": ["角色1", "角色2"],
|
||
"key_points": ["要点1", "要点2"],
|
||
"emotion": "情感基调",
|
||
"goal": "叙事目标"
|
||
}}
|
||
]
|
||
|
||
再次强调:
|
||
1. 只返回纯JSON数组,不要有```json```这样的标记
|
||
2. 数组中要包含{chapter_count}个章节对象
|
||
3. 所有内容描述中严禁使用任何特殊符号"""
|
||
|
||
# 大纲续写提示词(记忆增强版)
|
||
OUTLINE_CONTINUE = """你是一位经验丰富的小说作家和编剧。请基于以下信息续写小说大纲:
|
||
|
||
【项目信息】
|
||
- 书名:{title}
|
||
- 主题:{theme}
|
||
- 类型:{genre}
|
||
- 叙事视角:{narrative_perspective}
|
||
- 续写章节数:{chapter_count}章
|
||
|
||
【世界观】
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
【角色信息】
|
||
{characters_info}
|
||
|
||
【已有章节概览】(共{current_chapter_count}章)
|
||
{all_chapters_brief}
|
||
|
||
【最近剧情】
|
||
{recent_plot}
|
||
|
||
【🧠 智能记忆系统 - 续写参考】
|
||
以下是从故事记忆库中检索到的相关信息,请在续写大纲时参考:
|
||
|
||
{memory_context}
|
||
|
||
{mcp_references}
|
||
|
||
【续写指导】
|
||
- 当前情节阶段:{plot_stage_instruction}
|
||
- 起始章节编号:第{start_chapter}章
|
||
- 故事发展方向:{story_direction}
|
||
- 其他要求:{requirements}
|
||
|
||
请生成第{start_chapter}章到第{end_chapter}章的大纲。
|
||
要求:
|
||
- **剧情连贯性**:与前文自然衔接,保持故事连贯性
|
||
- **记忆参考**:适当参考记忆系统中的伏笔、钩子和情节点
|
||
- **伏笔回收**:可以考虑回收未完结的伏笔,制造呼应
|
||
- **角色发展**:遵循角色在前文中的成长轨迹
|
||
- **情节阶段**:遵循情节阶段的发展要求
|
||
- **风格一致**:保持与已有章节相同的风格和详细程度
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON数组格式,不要包含任何markdown标记、代码块标记或其他说明文字
|
||
2. JSON字符串值的内容描述中严禁使用任何特殊符号(包括中文引号、英文引号、方括号、书名号等)
|
||
3. 所有专有名词直接书写,不使用任何符号包裹
|
||
|
||
请严格按照以下JSON数组格式返回(共{chapter_count}个章节对象):
|
||
[
|
||
{{
|
||
"chapter_number": {start_chapter},
|
||
"title": "章节标题",
|
||
"summary": "章节概要的详细描述(100-200字),包含主要情节、角色互动、关键事件、冲突与转折",
|
||
"scenes": ["场景1描述", "场景2描述", "场景3描述"],
|
||
"characters": ["涉及角色1", "涉及角色2"],
|
||
"key_points": ["情节要点1", "情节要点2"],
|
||
"emotion": "本章情感基调",
|
||
"goal": "本章叙事目标"
|
||
}},
|
||
{{
|
||
"chapter_number": {start_chapter} + 1,
|
||
"title": "章节标题",
|
||
"summary": "章节概要...",
|
||
"scenes": ["场景1", "场景2"],
|
||
"characters": ["角色1", "角色2"],
|
||
"key_points": ["要点1", "要点2"],
|
||
"emotion": "情感基调",
|
||
"goal": "叙事目标"
|
||
}}
|
||
]
|
||
|
||
再次强调:
|
||
1. 只返回纯JSON数组,不要有```json```这样的标记
|
||
2. 数组中要包含{chapter_count}个章节对象
|
||
3. 每个summary必须是100-200字的详细描述
|
||
4. 确保字段结构与已有章节完全一致
|
||
5. 所有内容描述中严禁使用任何特殊符号"""
|
||
|
||
# AI去味提示词(核心特色功能)
|
||
AI_DENOISING = """你是一位追求自然写作风格的编辑。你的任务是将AI生成的文本改写得更像人类作家的手笔。
|
||
|
||
原文:
|
||
{original_text}
|
||
|
||
修改要求:
|
||
1. 去除AI痕迹:
|
||
- 删除过于工整的排比句
|
||
- 减少重复的修辞手法
|
||
- 去掉刻意的对称结构
|
||
- 避免机械式的总结陈词
|
||
|
||
2. 增加人性化:
|
||
- 使用更口语化的表达
|
||
- 添加不完美的细节
|
||
- 保留适度的随意性
|
||
- 增加真实的情感波动
|
||
|
||
3. 优化叙事:
|
||
- 让节奏更自然不做作
|
||
- 用简单词汇替换华丽辞藻
|
||
- 保持叙述的松弛感
|
||
- 让对话更生活化
|
||
|
||
4. 保持原意:
|
||
- 不改变核心情节
|
||
- 保留关键信息点
|
||
- 维持角色性格
|
||
- 确保逻辑连贯
|
||
|
||
修改风格:
|
||
- 像是一个喜欢讲故事的普通人写的
|
||
- 有点粗糙但很真诚
|
||
- 自然流畅不刻意
|
||
- 让人读起来很舒服
|
||
|
||
请直接输出修改后的文本,无需解释。"""
|
||
|
||
# 章节完整创作提示词
|
||
CHAPTER_GENERATION = """你是一位专业的小说作家。请根据以下信息创作本章内容:
|
||
|
||
项目信息:
|
||
- 书名:{title}
|
||
- 主题:{theme}
|
||
- 类型:{genre}
|
||
- 叙事视角:{narrative_perspective}
|
||
|
||
世界观:
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
角色信息:
|
||
{characters_info}
|
||
|
||
全书大纲:
|
||
{outlines_context}
|
||
|
||
本章信息:
|
||
- 章节序号:第{chapter_number}章
|
||
- 章节标题:{chapter_title}
|
||
- 章节大纲:{chapter_outline}
|
||
|
||
创作要求:
|
||
1. 严格按照大纲内容展开情节
|
||
2. 保持与前后章节的连贯性
|
||
3. 符合角色性格设定
|
||
4. 体现世界观特色
|
||
5. 使用{narrative_perspective}视角
|
||
6. 字数要求:目标{target_word_count}字,不得低于{target_word_count}字,必须严格控制在{target_word_count}至{max_word_count}字之间
|
||
7. 语言自然流畅,避免AI痕迹
|
||
|
||
请直接输出章节正文内容,不要包含章节标题和其他说明文字。"""
|
||
|
||
# 章节完整创作提示词(带前置章节上下文和记忆增强)
|
||
CHAPTER_GENERATION_WITH_CONTEXT = """你是一位专业的小说作家。请根据以下信息创作本章内容:
|
||
|
||
项目信息:
|
||
- 书名:{title}
|
||
- 主题:{theme}
|
||
- 类型:{genre}
|
||
- 叙事视角:{narrative_perspective}
|
||
|
||
世界观:
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
角色信息:
|
||
{characters_info}
|
||
|
||
全书大纲:
|
||
{outlines_context}
|
||
|
||
【已完成的前置章节内容】
|
||
{previous_content}
|
||
|
||
【🧠 智能记忆系统 - 重要参考】
|
||
以下是从故事记忆库中检索到的相关信息,请在创作时适当参考和呼应:
|
||
|
||
{memory_context}
|
||
|
||
本章信息:
|
||
- 章节序号:第{chapter_number}章
|
||
- 章节标题:{chapter_title}
|
||
- 章节大纲:{chapter_outline}
|
||
|
||
创作要求:
|
||
1. **剧情连贯性(最重要)**:
|
||
- 必须承接前面章节的剧情发展
|
||
- 注意角色状态、情节进展、时间线的连续性
|
||
- 不能出现与前文矛盾的内容
|
||
- 自然过渡,避免突兀的跳跃
|
||
|
||
2. **🔴 防止内容重复(关键)**:
|
||
- ⚠️ 仔细阅读【上一章结尾内容】,绝对不要重复叙述已经发生的事件
|
||
- ⚠️ 本章必须从新的情节点开始,不要重新描述上一章的场景或对话
|
||
- ⚠️ 如果上一章以某个动作或对话结束,本章应该从紧接着的下一个动作或反应开始
|
||
- ⚠️ 角色状态应该延续而非重置,不要让角色重新经历上一章已经经历的心理过程
|
||
- ⚠️ 场景转换要明确,如果是同一场景的延续,要从不同的视角或新的细节切入
|
||
|
||
3. **情节推进**:
|
||
- 严格按照本章大纲(expansion_plan)展开情节
|
||
- 推动故事向前发展,不要原地踏步
|
||
- 保持与全书大纲的一致性
|
||
- 确保本章有独特的叙事价值,而非前章内容的重复
|
||
|
||
4. **角色一致性**:
|
||
- 符合角色性格设定
|
||
- 延续角色在前文中的成长和变化
|
||
- 保持角色关系的连贯性
|
||
|
||
5. **写作风格**:
|
||
- 使用{narrative_perspective}视角
|
||
- 字数要求:目标{target_word_count}字,不得低于{target_word_count}字,必须严格控制在{target_word_count}至{max_word_count}字之间
|
||
- 语言自然流畅,避免AI痕迹
|
||
- 体现世界观特色
|
||
|
||
6. **承上启下**:
|
||
- 开头自然衔接上一章结尾(但不重复上一章内容)
|
||
- 结尾为下一章做好铺垫
|
||
|
||
6. **记忆系统使用指南**:
|
||
- **最近章节记忆**:保持情节连贯,注意角色状态和剧情发展
|
||
- **语义相关记忆**:参考相似情节的处理方式
|
||
- **未完结伏笔**:适当时机可以回收伏笔,制造呼应效果
|
||
- **角色状态记忆**:确保角色行为符合其发展轨迹
|
||
- **重要情节点**:与关键剧情保持一致
|
||
|
||
请直接输出章节正文内容,不要包含章节标题和其他说明文字。"""
|
||
|
||
|
||
# 单个角色生成提示词
|
||
SINGLE_CHARACTER_GENERATION = """你是一位专业的角色设定师。请根据以下信息创建一个立体饱满的小说角色。
|
||
|
||
{project_context}
|
||
|
||
{user_input}
|
||
|
||
请生成一个完整的角色卡片,包含以下所有信息:
|
||
|
||
1. **基本信息**:
|
||
- 姓名:如果用户未提供,请生成一个符合世界观的名字
|
||
- 年龄:具体数字或年龄段
|
||
- 性别:男/女/其他
|
||
|
||
2. **外貌特征**(100-150字):
|
||
- 身高体型、面容特征、着装风格
|
||
- 要符合角色定位和世界观设定
|
||
|
||
3. **性格特点**(150-200字):
|
||
- 核心性格特质(至少3个)
|
||
- 优点和缺点
|
||
- 特殊习惯或癖好
|
||
- 性格要有复杂性和矛盾性
|
||
|
||
4. **背景故事**(200-300字):
|
||
- 家庭背景
|
||
- 成长经历
|
||
- 重要转折事件
|
||
- 如何与项目主题关联
|
||
- 融入用户提供的背景设定
|
||
|
||
5. **人际关系**:
|
||
- 与现有角色的关系(如果有)
|
||
- 重要的人际纽带
|
||
- 社会地位和人脉
|
||
|
||
6. **特殊能力/特长**:
|
||
- 擅长的领域
|
||
- 特殊技能或知识
|
||
- 符合世界观设定
|
||
|
||
7. **职业信息**(重要 - 如果项目上下文中包含职业列表):
|
||
- 仔细查看项目上下文中的"可用主职业"和"可用副职业"列表
|
||
- 主职业:必须从"可用主职业"列表中选择一个最符合角色设定的职业,填写其职业名称(name字段)
|
||
- 主职业阶段:根据职业的阶段信息和角色实力,设定合理的当前阶段(1到职业的max_stage)
|
||
- 副职业:可以从"可用副职业"列表中选择0-2个,每个包含职业名称和阶段
|
||
- 如果项目没有职业列表,则不需要填写career_info字段
|
||
- 职业选择必须与角色的背景故事、能力特点和故事定位高度契合
|
||
- ⚠️ 重要:请填写职业的名称而非ID,系统会自动匹配
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON格式,不要包含任何markdown标记、代码块标记或其他说明文字
|
||
2. JSON字符串值的内容描述中严禁使用任何特殊符号(包括中文引号、英文引号、方括号、书名号等)
|
||
3. 所有专有名词直接书写,不使用任何符号包裹
|
||
|
||
请严格按照以下JSON格式返回:
|
||
{{
|
||
"name": "角色姓名",
|
||
"age": "年龄",
|
||
"gender": "性别",
|
||
"appearance": "外貌描述(100-150字)",
|
||
"personality": "性格特点(150-200字)",
|
||
"background": "背景故事(200-300字)",
|
||
"traits": ["特长1", "特长2", "特长3"],
|
||
|
||
"relationships_text": "人际关系的文字描述(用于显示)",
|
||
|
||
"relationships": [
|
||
{{
|
||
"target_character_name": "已存在的角色名称",
|
||
"relationship_type": "关系类型(如:师父、朋友、敌人、父亲、母亲等)",
|
||
"intimacy_level": 75,
|
||
"description": "这段关系的详细描述",
|
||
"started_at": "关系开始的故事时间点(可选)"
|
||
}}
|
||
],
|
||
|
||
"organization_memberships": [
|
||
{{
|
||
"organization_name": "已存在的组织名称",
|
||
"position": "职位名称",
|
||
"rank": 8,
|
||
"loyalty": 80,
|
||
"joined_at": "加入时间(可选)",
|
||
"status": "active"
|
||
}}
|
||
],
|
||
|
||
"career_info": {{
|
||
"main_career_name": "从项目上下文的可用主职业列表中复制的职业名称",
|
||
"main_career_stage": 5,
|
||
"sub_careers": [
|
||
{{
|
||
"career_name": "从项目上下文的可用副职业列表中复制的职业名称",
|
||
"stage": 3
|
||
}}
|
||
]
|
||
}}
|
||
}}
|
||
|
||
**关系类型参考(请从中选择或自定义):**
|
||
- 家族关系:父亲、母亲、兄弟、姐妹、子女、配偶、恋人
|
||
- 社交关系:师父、徒弟、朋友、同学、同事、邻居、知己
|
||
- 职业关系:上司、下属、合作伙伴
|
||
- 敌对关系:敌人、仇人、竞争对手、宿敌
|
||
|
||
**重要说明:**
|
||
1. relationships数组:只包含与上面列出的已存在角色的关系,通过target_character_name匹配
|
||
2. organization_memberships数组:只包含与上面列出的已存在组织的关系
|
||
3. intimacy_level是-100到100的整数(负值表示敌对、仇恨等关系),loyalty是0-100的整数
|
||
4. 如果没有关系或组织,对应数组为空[]
|
||
5. relationships_text是自然语言描述,用于展示给用户看
|
||
|
||
**角色设定要求:**
|
||
- 角色要符合项目的世界观和主题
|
||
- 如果是主角,要有明确的成长空间和目标动机
|
||
- 如果是反派,要有合理的动机,不能脸谱化
|
||
- 配角要有独特性,不能是工具人
|
||
- 所有设定要为故事服务
|
||
|
||
再次强调:
|
||
1. 只返回纯JSON对象,不要有```json```这样的标记
|
||
2. 所有内容描述中严禁使用任何特殊符号
|
||
3. 不要有任何额外的文字说明"""
|
||
|
||
# 单个组织生成提示词
|
||
SINGLE_ORGANIZATION_GENERATION = """你是一位专业的组织设定师。请根据以下信息创建一个完整的组织/势力设定。
|
||
|
||
{project_context}
|
||
|
||
{user_input}
|
||
|
||
请生成一个完整的组织设定,包含以下所有信息:
|
||
|
||
1. **基本信息**:
|
||
- 组织名称:如果用户未提供,请生成一个符合世界观的名称
|
||
- 组织类型:如帮派、公司、门派、学院、政府机构、宗教组织等
|
||
- 成立时间:具体时间或时间段
|
||
|
||
2. **组织特性**(150-200字):
|
||
- 组织的核心理念和行事风格
|
||
- 组织文化和价值观
|
||
- 运作方式和管理模式
|
||
- 特殊传统或规矩
|
||
|
||
3. **组织背景**(200-300字):
|
||
- 建立历史和起源
|
||
- 发展历程和重要事件
|
||
- 目前的地位和影响力
|
||
- 如何与项目主题关联
|
||
- 融入用户提供的背景设定
|
||
|
||
4. **外在表现**(100-150字):
|
||
- 总部或主要据点位置
|
||
- 标志性建筑或场所
|
||
- 组织标志、徽章、制服等
|
||
- 可辨识的外在特征
|
||
|
||
5. **组织目的/宗旨**:
|
||
- 明确的组织目标
|
||
- 长期愿景
|
||
- 行动准则
|
||
|
||
6. **势力等级**:
|
||
- 在世界中的影响力(0-100)
|
||
- 综合实力评估
|
||
|
||
7. **所在地点**:
|
||
- 主要活动区域
|
||
- 势力范围
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON格式,不要包含任何markdown标记、代码块标记或其他说明文字
|
||
2. JSON字符串值的内容描述中严禁使用任何特殊符号(包括中文引号、英文引号、方括号、书名号等)
|
||
3. 所有专有名词直接书写,不使用任何符号包裹
|
||
|
||
请严格按照以下JSON格式返回:
|
||
{{
|
||
"name": "组织名称",
|
||
"is_organization": true,
|
||
"organization_type": "组织类型",
|
||
"personality": "组织特性(150-200字)",
|
||
"background": "组织背景(200-300字)",
|
||
"appearance": "外在表现(100-150字)",
|
||
"organization_purpose": "组织目的和宗旨",
|
||
"power_level": 75,
|
||
"location": "所在地点",
|
||
"motto": "组织格言或口号",
|
||
"traits": ["特征1", "特征2", "特征3"],
|
||
"color": "组织代表颜色(如:深红色、金色、黑色等)",
|
||
"organization_members": ["重要成员1", "重要成员2", "重要成员3"]
|
||
}}
|
||
|
||
**组织设定要求:**
|
||
- 组织要符合项目的世界观和主题
|
||
- 目标和行动要合理,不能过于理想化或脸谱化
|
||
- 要有存在的必要性,能推动故事发展
|
||
- 内部要有层级和结构
|
||
- 与其他势力要有互动关系
|
||
|
||
**说明**:
|
||
1. power_level是0-100的整数,表示组织在世界中的影响力
|
||
2. organization_members是组织内重要成员的名字列表(如果已有角色,可以关联)
|
||
3. 所有文本描述要详细具体,避免空泛
|
||
|
||
再次强调:
|
||
1. 只返回纯JSON对象,不要有```json```这样的标记
|
||
2. 所有内容描述中严禁使用任何特殊符号
|
||
3. 不要有任何额外的文字说明"""
|
||
|
||
# 情节分析提示词
|
||
PLOT_ANALYSIS = """你是一位专业的小说编辑和剧情分析师。请深度分析以下章节内容:
|
||
|
||
**章节信息:**
|
||
- 章节: 第{chapter_number}章
|
||
- 标题: {title}
|
||
- 字数: {word_count}字
|
||
|
||
**章节内容:**
|
||
{content}
|
||
|
||
---
|
||
|
||
**分析任务:**
|
||
请从专业编辑的角度,全面分析这一章节:
|
||
|
||
### 1. 剧情钩子 (Hooks) - 吸引读者的元素
|
||
识别能够吸引读者继续阅读的关键元素:
|
||
- **悬念钩子**: 未解之谜、疑问、谜团
|
||
- **情感钩子**: 引发共鸣的情感点、触动心弦的时刻
|
||
- **冲突钩子**: 矛盾对抗、紧张局势
|
||
- **认知钩子**: 颠覆认知的信息、惊人真相
|
||
|
||
每个钩子需要:
|
||
- 类型分类
|
||
- 具体内容描述
|
||
- 强度评分(1-10)
|
||
- 出现位置(开头/中段/结尾)
|
||
- **关键词**: 【必填】从章节原文中逐字复制一段关键文本(8-25字),必须是原文中真实存在的连续文字,用于在文本中精确定位。不要概括或改写,必须原样复制!
|
||
|
||
### 2. 伏笔分析 (Foreshadowing)
|
||
- **埋下的新伏笔**: 描述内容、预期作用、隐藏程度(1-10)
|
||
- **回收的旧伏笔**: 呼应哪一章、回收效果评分
|
||
- **伏笔质量**: 巧妙性和合理性评估
|
||
- **关键词**: 【必填】从章节原文中逐字复制一段关键文本(8-25字),必须是原文中真实存在的连续文字,用于在文本中精确定位。不要概括或改写,必须原样复制!
|
||
|
||
### 3. 冲突分析 (Conflict)
|
||
- 冲突类型: 人与人/人与己/人与环境/人与社会
|
||
- 冲突各方及其立场
|
||
- 冲突强度评分(1-10)
|
||
- 冲突解决进度(0-100%)
|
||
|
||
### 4. 情感曲线 (Emotional Arc)
|
||
- 主导情绪(最多10个字): 紧张/温馨/悲伤/激昂/平静/压抑/欢快/恐惧/期待/失落等
|
||
- 情感强度(1-10)
|
||
- 情绪变化轨迹描述
|
||
|
||
### 5. 角色状态追踪 (Character Development)
|
||
对每个出场角色分析:
|
||
- 心理状态变化(前→后)
|
||
- 关系变化
|
||
- 关键行动和决策
|
||
- 成长或退步
|
||
- **💼 职业变化(重要 - 新增)**:
|
||
- 如果角色在本章有职业相关的进展或突破,请详细分析
|
||
- 主职业阶段变化: 是否晋级、突破或降级(用整数表示变化量,如: +1表示晋升一阶段,-1表示退步一阶段,0表示无变化)
|
||
- 副职业变化: 是否学习新的副职业或副职业有所精进
|
||
- 职业突破描述: 具体的突破过程、原因和标志性事件
|
||
- 注意:只有当章节中明确描述了职业相关的成长、突破或变化时才填写此项
|
||
|
||
### 6. 关键情节点 (Plot Points)
|
||
列出3-5个核心情节点:
|
||
- 情节内容
|
||
- 类型(revelation/conflict/resolution/transition)
|
||
- 重要性(0.0-1.0)
|
||
- 对故事的影响
|
||
- **关键词**: 【必填】从章节原文中逐字复制一段关键文本(8-25字),必须是原文中真实存在的连续文字,用于在文本中精确定位。不要概括或改写,必须原样复制!
|
||
|
||
### 7. 场景与节奏
|
||
- 主要场景
|
||
- 叙事节奏(快/中/慢)
|
||
- 对话与描写的比例
|
||
|
||
### 8. 质量评分
|
||
- 节奏把控: 1-10分
|
||
- 吸引力: 1-10分
|
||
- 连贯性: 1-10分
|
||
- 整体质量: 1-10分
|
||
|
||
### 9. 改进建议
|
||
提供3-5条具体的改进建议
|
||
|
||
---
|
||
|
||
**输出格式(纯JSON,不要markdown标记):**
|
||
|
||
{{
|
||
"hooks": [
|
||
{{
|
||
"type": "悬念",
|
||
"content": "具体描述",
|
||
"strength": 8,
|
||
"position": "中段",
|
||
"keyword": "必须从原文逐字复制的文本片段"
|
||
}}
|
||
],
|
||
"foreshadows": [
|
||
{{
|
||
"content": "伏笔内容",
|
||
"type": "planted",
|
||
"strength": 7,
|
||
"subtlety": 8,
|
||
"reference_chapter": null,
|
||
"keyword": "必须从原文逐字复制的文本片段"
|
||
}}
|
||
],
|
||
"conflict": {{
|
||
"types": ["人与人", "人与己"],
|
||
"parties": ["主角-复仇", "反派-维护现状"],
|
||
"level": 8,
|
||
"description": "冲突描述",
|
||
"resolution_progress": 0.3
|
||
}},
|
||
"emotional_arc": {{
|
||
"primary_emotion": "紧张焦虑",
|
||
"intensity": 8,
|
||
"curve": "平静→紧张→高潮→释放",
|
||
"secondary_emotions": ["期待", "焦虑"]
|
||
}},
|
||
"character_states": [
|
||
{{
|
||
"character_name": "张三",
|
||
"state_before": "犹豫",
|
||
"state_after": "坚定",
|
||
"psychological_change": "心理变化描述",
|
||
"key_event": "触发事件",
|
||
"relationship_changes": {{"李四": "关系改善"}}
|
||
}}
|
||
],
|
||
"plot_points": [
|
||
{{
|
||
"content": "情节点描述",
|
||
"type": "revelation",
|
||
"importance": 0.9,
|
||
"impact": "推动故事发展",
|
||
"keyword": "必须从原文逐字复制的文本片段"
|
||
}}
|
||
],
|
||
"scenes": [
|
||
{{
|
||
"location": "地点",
|
||
"atmosphere": "氛围",
|
||
"duration": "时长估计"
|
||
}}
|
||
],
|
||
"pacing": "varied",
|
||
"dialogue_ratio": 0.4,
|
||
"description_ratio": 0.3,
|
||
"scores": {{
|
||
"pacing": 8,
|
||
"engagement": 9,
|
||
"coherence": 8,
|
||
"overall": 8.5
|
||
}},
|
||
"plot_stage": "发展",
|
||
"suggestions": [
|
||
"具体建议1",
|
||
"具体建议2"
|
||
]
|
||
}}
|
||
|
||
**重要提示:**
|
||
1. 每个钩子、伏笔、情节点的keyword字段是必填的,不能为空
|
||
2. keyword必须是从章节原文中逐字复制的文本,长度8-25字
|
||
3. keyword用于在前端标注文本位置,所以必须能在原文中精确找到
|
||
4. 不要使用概括性语句或改写后的文字作为keyword
|
||
5. **职业变化字段说明**:
|
||
- career_changes是可选字段,只有当章节中明确描述了职业相关变化时才填写
|
||
- main_career_stage_change: 整数,表示主职业阶段变化量(+1=晋升一阶,-1=退步一阶,0=无变化)
|
||
- sub_career_changes: 数组,包含副职业的变化,每项包含career_name(职业名称)和stage_change(阶段变化量)
|
||
- new_careers: 数组,包含新获得的职业名称(如果有)
|
||
- career_breakthrough: 字符串,描述职业突破的具体过程和标志性事件
|
||
- 如果角色没有职业变化,可以不填写career_changes字段或设为空对象
|
||
|
||
只返回JSON,不要其他说明。"""
|
||
|
||
# 大纲单批次展开提示词
|
||
OUTLINE_EXPAND_SINGLE = """你是专业的小说情节架构师。请分析以下大纲节点,将其展开为 {target_chapter_count} 个章节的详细规划。
|
||
|
||
【项目信息】
|
||
小说名称:{project_title}
|
||
类型:{project_genre}
|
||
主题:{project_theme}
|
||
叙事视角:{project_narrative_perspective}
|
||
|
||
【世界观背景】
|
||
时间背景:{project_world_time_period}
|
||
地理位置:{project_world_location}
|
||
氛围基调:{project_world_atmosphere}
|
||
|
||
【角色信息】
|
||
{characters_info}
|
||
|
||
【当前大纲节点 - 展开对象】
|
||
序号:第 {outline_order_index} 节
|
||
标题:{outline_title}
|
||
内容:{outline_content}
|
||
|
||
【上下文参考】
|
||
{context_info}
|
||
|
||
【展开策略】
|
||
{strategy_instruction}
|
||
|
||
【⚠️ 重要约束 - 必须严格遵守】
|
||
1. **内容边界约束**:
|
||
- ✅ 只能展开【当前大纲节点】中明确描述的内容
|
||
- ❌ 绝对不能推进到后续大纲的内容(如果有【后一节】信息)
|
||
- ❌ 不要让剧情快速推进,要深化而非跨越
|
||
|
||
2. **展开原则**:
|
||
- 将当前大纲的单一事件拆解为多个细节丰富的章节
|
||
- 深入挖掘情感、心理、环境、对话等细节
|
||
- 放慢叙事节奏,让读者充分体验当前阶段的剧情
|
||
- 每个章节都应该是当前大纲内容的不同侧面或阶段
|
||
|
||
3. **如何避免剧情越界**:
|
||
- 如果当前大纲描述"主角遇到困境",展开时应详写困境的发现、分析、情感冲击等
|
||
- 不要直接写到"解决困境",除非原大纲明确包含解决过程
|
||
- 如果看到【后一节】的内容,那些是禁区,绝不提前展开
|
||
|
||
4. **🔴 相邻章节差异化约束(重要 - 防止内容重复)**:
|
||
- 每个章节必须有独特的开场方式(不同的场景、时间点、角色状态)
|
||
- 每个章节必须有独特的结束方式(不同的悬念、转折、情感收尾)
|
||
- key_events在相邻章节间绝不允许重叠,每章的关键事件必须完全不同
|
||
- plot_summary必须描述该章的独特内容,不能与其他章节雷同
|
||
- 即使是同一事件的不同阶段,也要明确区分"前、中、后"的具体内容
|
||
- 例如:第1章可以是"发现线索",第2章必须是"追踪调查"而非再次"发现线索"
|
||
|
||
【任务要求】
|
||
1. 深度分析该大纲的剧情容量和叙事节奏
|
||
2. 识别关键剧情点、冲突点和情感转折点(仅限当前大纲范围内)
|
||
3. 将大纲拆解为 {target_chapter_count} 个章节,每章需包含:
|
||
- sub_index: 子章节序号(1, 2, 3...)
|
||
- title: 章节标题(体现该章核心冲突或情感)
|
||
- plot_summary: 剧情摘要(200-300字,详细描述该章发生的事件,仅限当前大纲内容)
|
||
- key_events: 关键事件列表(3-5个关键剧情点,必须在当前大纲范围内)
|
||
- character_focus: 角色焦点(主要涉及的角色名称)
|
||
- emotional_tone: 情感基调(如:紧张、温馨、悲伤、激动等)
|
||
- narrative_goal: 叙事目标(该章要达成的叙事效果)
|
||
- conflict_type: 冲突类型(如:内心挣扎、人际冲突、环境挑战等)
|
||
- estimated_words: 预计字数(建议2000-5000字)
|
||
{scene_instruction}
|
||
5. 确保章节间:
|
||
- 衔接自然流畅(每章从不同的起点开始)
|
||
- 剧情递进合理(但不超出当前大纲边界)
|
||
- 节奏张弛有度
|
||
- 每章都有明确且独特的叙事价值(不重复前一章的内容)
|
||
- 最后一章结束时,剧情发展程度应恰好完成当前大纲描述的内容,不多不少
|
||
- **关键事件无重叠**:仔细检查相邻章节的key_events,确保没有任何重复或雷同
|
||
|
||
【输出格式】
|
||
请严格按照以下JSON数组格式输出,不要添加任何其他文字:
|
||
[
|
||
{{
|
||
"sub_index": 1,
|
||
"title": "章节标题",
|
||
"plot_summary": "该章详细剧情摘要...",
|
||
"key_events": ["关键事件1", "关键事件2", "关键事件3"],
|
||
"character_focus": ["角色A", "角色B"],
|
||
"emotional_tone": "情感基调",
|
||
"narrative_goal": "叙事目标",
|
||
"conflict_type": "冲突类型",
|
||
"estimated_words": 3000{scene_field}
|
||
}}
|
||
]
|
||
|
||
请开始分析并生成章节规划:
|
||
"""
|
||
|
||
# 大纲分批展开提示词
|
||
OUTLINE_EXPAND_MULTI = """你是专业的小说情节架构师。请继续分析以下大纲节点,将其展开为第{start_index}-{end_index}节(共{target_chapter_count}个章节)的详细规划。
|
||
|
||
【项目信息】
|
||
小说名称:{project_title}
|
||
类型:{project_genre}
|
||
主题:{project_theme}
|
||
叙事视角:{project_narrative_perspective}
|
||
|
||
【世界观背景】
|
||
时间背景:{project_world_time_period}
|
||
地理位置:{project_world_location}
|
||
氛围基调:{project_world_atmosphere}
|
||
|
||
【角色信息】
|
||
{characters_info}
|
||
|
||
【当前大纲节点 - 展开对象】
|
||
序号:第 {outline_order_index} 节
|
||
标题:{outline_title}
|
||
内容:{outline_content}
|
||
|
||
【上下文参考】
|
||
{context_info}
|
||
{previous_context}
|
||
|
||
【展开策略】
|
||
{strategy_instruction}
|
||
|
||
【⚠️ 重要约束 - 必须严格遵守】
|
||
1. **内容边界约束**:
|
||
- ✅ 只能展开【当前大纲节点】中明确描述的内容
|
||
- ❌ 绝对不能推进到后续大纲的内容(如果有【后一节】信息)
|
||
- ❌ 不要让剧情快速推进,要深化而非跨越
|
||
|
||
2. **分批连续性约束**:
|
||
- 这是第{start_index}-{end_index}节,是整个展开的一部分
|
||
- 必须与前面已生成的章节自然衔接
|
||
- 从第{start_index}节开始编号(sub_index从{start_index}开始)
|
||
- 继续深化当前大纲的内容,保持叙事连贯性
|
||
|
||
3. **展开原则**:
|
||
- 将当前大纲的单一事件拆解为多个细节丰富的章节
|
||
- 深入挖掘情感、心理、环境、对话等细节
|
||
- 放慢叙事节奏,让读者充分体验当前阶段的剧情
|
||
- 每个章节都应该是当前大纲内容的不同侧面或阶段
|
||
|
||
4. **🔴 相邻章节差异化约束(重要 - 防止内容重复)**:
|
||
- 每个章节必须有独特的开场方式(不同的场景、时间点、角色状态)
|
||
- 每个章节必须有独特的结束方式(不同的悬念、转折、情感收尾)
|
||
- key_events在相邻章节间绝不允许重叠,每章的关键事件必须完全不同
|
||
- plot_summary必须描述该章的独特内容,不能与其他章节雷同
|
||
- 特别注意与【已生成的前序章节】的差异化,避免重复已有内容
|
||
- 即使是同一事件的不同阶段,也要明确区分"前、中、后"的具体内容
|
||
|
||
【任务要求】
|
||
1. 深度分析该大纲的剧情容量和叙事节奏
|
||
2. 识别关键剧情点、冲突点和情感转折点(仅限当前大纲范围内)
|
||
3. 生成第{start_index}-{end_index}节的章节规划,每章需包含:
|
||
- sub_index: 子章节序号(从{start_index}开始)
|
||
- title: 章节标题(体现该章核心冲突或情感)
|
||
- plot_summary: 剧情摘要(200-300字,详细描述该章发生的事件)
|
||
- key_events: 关键事件列表(3-5个关键剧情点)
|
||
- character_focus: 角色焦点(主要涉及的角色名称)
|
||
- emotional_tone: 情感基调(如:紧张、温馨、悲伤、激动等)
|
||
- narrative_goal: 叙事目标(该章要达成的叙事效果)
|
||
- conflict_type: 冲突类型(如:内心挣扎、人际冲突、环境挑战等)
|
||
- estimated_words: 预计字数(建议2000-5000字)
|
||
{scene_instruction}
|
||
5. 确保章节间:
|
||
- 与前面章节衔接自然流畅(每章从不同的起点开始)
|
||
- 剧情递进合理(但不超出当前大纲边界)
|
||
- 节奏张弛有度
|
||
- 每章都有明确且独特的叙事价值(不重复前面章节的内容)
|
||
- **关键事件无重叠**:仔细检查本批次章节的key_events,以及与前序章节的key_events,确保没有任何重复或雷同
|
||
|
||
【输出格式】
|
||
请严格按照以下JSON数组格式输出,不要添加任何其他文字:
|
||
[
|
||
{{
|
||
"sub_index": {start_index},
|
||
"title": "章节标题",
|
||
"plot_summary": "该章详细剧情摘要...",
|
||
"key_events": ["关键事件1", "关键事件2", "关键事件3"],
|
||
"character_focus": ["角色A", "角色B"],
|
||
"emotional_tone": "情感基调",
|
||
"narrative_goal": "叙事目标",
|
||
"conflict_type": "冲突类型",
|
||
"estimated_words": 3000{scene_field}
|
||
}}
|
||
]
|
||
|
||
请开始分析并生成第{start_index}-{end_index}节的章节规划:
|
||
"""
|
||
|
||
# 章节重写系统提示词
|
||
CHAPTER_REGENERATION_SYSTEM = """你是一位经验丰富的专业小说编辑和作家。现在需要根据反馈意见重新创作一个章节。
|
||
|
||
你的任务是:
|
||
1. 仔细理解原始章节的内容和意图
|
||
2. 认真分析所有的修改要求
|
||
3. 在保持故事连贯性的前提下,创作一个改进后的新版本
|
||
4. 确保新版本在艺术性和可读性上都有明显提升
|
||
|
||
---
|
||
"""
|
||
# MCP工具测试提示词
|
||
MCP_TOOL_TEST = """你是MCP插件测试助手,需要测试插件 '{plugin_name}' 的功能。
|
||
|
||
⚠️ 重要规则:生成参数时,必须严格使用工具 schema 中定义的原始参数名称,不要转换为 snake_case 或其他格式。
|
||
例如:如果 schema 中是 'nextThoughtNeeded',就必须使用 'nextThoughtNeeded',不能改成 'next_thought_needed'。
|
||
|
||
请选择一个合适的工具进行测试,优先选择搜索、查询类工具。
|
||
生成真实有效的测试参数(例如搜索"人工智能最新进展"而不是"test")。
|
||
|
||
现在开始测试这个插件。"""
|
||
|
||
MCP_TOOL_TEST_SYSTEM = """你是专业的API测试工具。当给定工具列表时,选择一个工具并使用合适的参数调用它。
|
||
|
||
⚠️ 关键规则:调用工具时,必须严格使用 schema 中定义的原始参数名,不要自行转换命名风格。
|
||
- 如果参数名是 camelCase(如 nextThoughtNeeded),就使用 camelCase
|
||
- 如果参数名是 snake_case(如 next_thought),就使用 snake_case
|
||
- 保持与 schema 中定义的完全一致,包括大小写和命名风格"""
|
||
|
||
# 灵感模式提示词字典
|
||
INSPIRATION_PROMPTS = {
|
||
"title": {
|
||
"system": """你是一位专业的小说创作顾问。
|
||
用户的原始想法:{initial_idea}
|
||
|
||
请根据用户的想法,生成6个吸引人的书名建议,要求:
|
||
1. 紧扣用户的原始想法和核心故事构思
|
||
2. 富有创意和吸引力
|
||
3. 涵盖不同的风格倾向
|
||
|
||
返回JSON格式:
|
||
{{
|
||
"prompt": "根据你的想法,我为你准备了几个书名建议:",
|
||
"options": ["书名1", "书名2", "书名3", "书名4", "书名5", "书名6"]
|
||
}}
|
||
|
||
只返回纯JSON,不要有其他文字。""",
|
||
"user": "用户的想法:{initial_idea}\n请生成6个书名建议"
|
||
},
|
||
"description": {
|
||
"system": """你是一位专业的小说创作顾问。
|
||
用户的原始想法:{initial_idea}
|
||
已确定的书名:{title}
|
||
|
||
请生成6个精彩的小说简介,要求:
|
||
1. 必须紧扣用户的原始想法,确保简介是原始想法的具体展开
|
||
2. 符合已确定的书名风格
|
||
3. 简洁有力,每个50-100字
|
||
4. 包含核心冲突
|
||
5. 涵盖不同的故事走向,但都基于用户的原始构思
|
||
|
||
返回JSON格式:
|
||
{{"prompt":"选择一个简介:","options":["简介1","简介2","简介3","简介4","简介5","简介6"]}}
|
||
|
||
只返回纯JSON,不要有其他文字,不要换行。""",
|
||
"user": "原始想法:{initial_idea}\n书名:{title}\n请生成6个简介选项"
|
||
},
|
||
"theme": {
|
||
"system": """你是一位专业的小说创作顾问。
|
||
用户的原始想法:{initial_idea}
|
||
小说信息:
|
||
- 书名:{title}
|
||
- 简介:{description}
|
||
|
||
请生成6个深刻的主题选项,要求:
|
||
1. 必须与用户的原始想法保持高度一致
|
||
2. 符合书名和简介的风格
|
||
3. 有深度和思想性
|
||
4. 每个50-150字
|
||
5. 涵盖不同角度(如:成长、复仇、救赎、探索等),但都围绕用户的核心构思
|
||
|
||
返回JSON格式:
|
||
{{"prompt":"这本书的核心主题是什么?","options":["主题1","主题2","主题3","主题4","主题5","主题6"]}}
|
||
|
||
只返回纯JSON,不要有其他文字,不要换行。""",
|
||
"user": "原始想法:{initial_idea}\n书名:{title}\n简介:{description}\n请生成6个主题选项"
|
||
},
|
||
"genre": {
|
||
"system": """你是一位专业的小说创作顾问。
|
||
用户的原始想法:{initial_idea}
|
||
小说信息:
|
||
- 书名:{title}
|
||
- 简介:{description}
|
||
- 主题:{theme}
|
||
|
||
请生成6个合适的类型标签(每个2-4字),要求:
|
||
1. 必须符合用户原始想法中暗示的类型倾向
|
||
2. 符合小说整体风格
|
||
3. 可以多选组合
|
||
|
||
常见类型:玄幻、都市、科幻、武侠、仙侠、历史、言情、悬疑、奇幻、修仙等
|
||
|
||
返回JSON格式:
|
||
{{"prompt":"选择类型标签(可多选):","options":["类型1","类型2","类型3","类型4","类型5","类型6"]}}
|
||
|
||
只返回紧凑的纯JSON,不要换行,不要有其他文字。""",
|
||
"user": "原始想法:{initial_idea}\n书名:{title}\n简介:{description}\n主题:{theme}\n请生成6个类型标签"
|
||
}
|
||
}
|
||
|
||
# 灵感模式智能补全提示词
|
||
INSPIRATION_QUICK_COMPLETE = """你是一位专业的小说创作顾问。用户提供了部分小说信息,请补全缺失的字段。
|
||
|
||
用户已提供的信息:
|
||
{existing}
|
||
|
||
请生成完整的小说方案,包含:
|
||
1. title: 书名(3-6字,如果用户已提供则保持原样)
|
||
2. description: 简介(50-100字,必须基于用户提供的信息,不要偏离原意)
|
||
3. theme: 核心主题(30-50字,必须与用户提供的信息保持一致)
|
||
4. genre: 类型标签数组(2-3个)
|
||
|
||
重要:所有补全的内容都必须与用户提供的信息保持高度关联,确保前后一致性。
|
||
|
||
返回JSON格式:
|
||
{{
|
||
"title": "书名",
|
||
"description": "简介内容...",
|
||
"theme": "主题内容...",
|
||
"genre": ["类型1", "类型2"]
|
||
}}
|
||
|
||
只返回纯JSON,不要有其他文字。"""
|
||
# 世界观资料收集提示词(MCP增强用)
|
||
MCP_WORLD_BUILDING_PLANNING = """你正在为小说《{title}》设计世界观。
|
||
|
||
【小说信息】
|
||
- 题材:{genre}
|
||
- 主题:{theme}
|
||
- 简介:{description}
|
||
|
||
【任务】
|
||
请使用可用工具搜索相关背景资料,帮助构建更真实、更有深度的世界观设定。
|
||
你可以查询:
|
||
1. 历史背景(如果是历史题材)
|
||
2. 地理环境和文化特征
|
||
3. 相关领域的专业知识
|
||
4. 类似作品的设定参考
|
||
|
||
请查询最关键的1个问题(不要超过1个)。"""
|
||
|
||
# 角色资料收集提示词(MCP增强用)
|
||
MCP_CHARACTER_PLANNING = """你正在为小说《{title}》设计角色。
|
||
|
||
【小说信息】
|
||
- 题材:{genre}
|
||
- 主题:{theme}
|
||
- 时代背景:{time_period}
|
||
- 地理位置:{location}
|
||
|
||
【任务】
|
||
请使用可用工具搜索相关参考资料,帮助设计更真实、更有深度的角色。
|
||
你可以查询:
|
||
1. 该时代/地域的真实历史人物特征
|
||
2. 文化背景和社会习俗
|
||
3. 职业特点和生活方式
|
||
4. 相关领域的人物原型
|
||
|
||
请查询最关键的1个问题(不要超过1个)。"""
|
||
|
||
# 自动角色引入 - 预测性分析提示词(方案A)
|
||
AUTO_CHARACTER_ANALYSIS = """你是专业的小说角色设计顾问。请根据即将续写的剧情方向,预测是否需要引入新角色。
|
||
|
||
【项目信息】
|
||
- 书名:{title}
|
||
- 类型:{genre}
|
||
- 主题:{theme}
|
||
|
||
【世界观】
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
|
||
【已有角色】
|
||
{existing_characters}
|
||
|
||
【已有章节概览】
|
||
{all_chapters_brief}
|
||
|
||
【续写计划】
|
||
- 起始章节:第{start_chapter}章
|
||
- 续写数量:{chapter_count}章
|
||
- 剧情阶段:{plot_stage}
|
||
- 发展方向:{story_direction}
|
||
|
||
【预测性分析任务】
|
||
请预测在接下来的{chapter_count}章中,根据剧情发展方向和阶段,是否需要引入新角色。
|
||
|
||
**分析要点:**
|
||
1. **剧情需求预测**:根据发展方向,哪些场景、冲突需要新角色参与
|
||
2. **角色充分性**:现有角色是否足以支撑即将发生的剧情
|
||
3. **引入时机**:新角色应该在哪个章节登场最合适
|
||
4. **重要性判断**:新角色对后续剧情的影响程度
|
||
|
||
**预测依据:**
|
||
- 剧情阶段的典型角色需求(如:高潮阶段可能需要强力对手)
|
||
- 故事发展方向的逻辑需要(如:进入新地点需要当地角色)
|
||
- 冲突升级的角色需求(如:更强的反派、意外的盟友)
|
||
- 世界观扩展的需要(如:新组织、新势力的代表)
|
||
|
||
**如果需要新角色,请详细说明:**
|
||
- 角色定位和作用
|
||
- 建议的角色类型和重要性
|
||
- 预计登场时机
|
||
- 与现有角色的潜在关系
|
||
|
||
**输出格式(纯JSON):**
|
||
{{
|
||
"needs_new_characters": true,
|
||
"reason": "预测分析原因(150-200字),说明为什么即将的剧情需要新角色",
|
||
"character_count": 2,
|
||
"character_specifications": [
|
||
{{
|
||
"name": "建议的角色名字(可选,如果有明确想法)",
|
||
"role_description": "角色在剧情中的定位和作用(100-150字)",
|
||
"suggested_role_type": "supporting/antagonist/protagonist",
|
||
"importance": "high/medium/low",
|
||
"appearance_chapter": {start_chapter},
|
||
"key_abilities": ["能力1", "能力2"],
|
||
"plot_function": "在剧情中的具体功能(如:作为主要对手、提供关键信息等)",
|
||
"relationship_suggestions": [
|
||
{{
|
||
"target_character": "现有角色名",
|
||
"relationship_type": "建议的关系类型",
|
||
"reason": "为什么建立这种关系"
|
||
}}
|
||
]
|
||
}}
|
||
]
|
||
}}
|
||
|
||
或者如果不需要新角色:
|
||
{{
|
||
"needs_new_characters": false,
|
||
"reason": "现有角色足以支撑即将的剧情发展,说明理由"
|
||
}}
|
||
|
||
**重要提示:**
|
||
- 这是预测性分析,不是基于已生成内容的事后分析
|
||
- 要考虑剧情的自然发展和节奏
|
||
- 不要为了引入角色而引入,确保必要性
|
||
- 优先考虑角色的长期作用,而非一次性功能
|
||
|
||
只返回纯JSON,不要有markdown标记或其他文字。"""
|
||
|
||
# 自动角色引入 - 生成提示词
|
||
AUTO_CHARACTER_GENERATION = """你是专业的角色设定师。请根据以下信息,为小说生成新角色的完整设定。
|
||
|
||
【项目信息】
|
||
- 书名:{title}
|
||
- 类型:{genre}
|
||
- 主题:{theme}
|
||
|
||
【世界观】
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
【已有角色】
|
||
{existing_characters}
|
||
|
||
【剧情上下文】
|
||
{plot_context}
|
||
|
||
【角色规格要求】
|
||
{character_specification}
|
||
|
||
【MCP工具参考】
|
||
{mcp_references}
|
||
|
||
【生成要求】
|
||
1. 角色必须符合剧情需求和世界观设定
|
||
2. **必须分析新角色与已有角色的关系**,至少建立1-3个有意义的关系
|
||
3. 性格、背景要有深度和独特性
|
||
4. 外貌描写要具体生动
|
||
5. 特长和能力要符合角色定位
|
||
6. **如果【已有角色】中包含职业列表,必须为角色设定职业**(参考下方职业信息要求)
|
||
|
||
**关系建立指导(非常重要):**
|
||
- 仔细审视【已有角色】列表,思考新角色与哪些现有角色有联系
|
||
- 根据剧情需求,建立合理的角色关系(如:主角的新朋友、反派的手下、某角色的亲属等)
|
||
- 每个关系都要有明确的类型、亲密度和描述
|
||
- 关系应该服务于剧情发展,推动故事前进
|
||
- 如果新角色是组织成员,记得填写organization_memberships
|
||
|
||
**重要格式要求:**
|
||
1. 只返回纯JSON格式,不要包含任何markdown标记或其他说明文字
|
||
2. JSON字符串值中严禁使用特殊符号(引号、方括号、书名号等)
|
||
3. 所有专有名词直接书写,不使用任何符号包裹
|
||
|
||
【职业信息要求(重要)】
|
||
如果【已有角色】部分包含"可用主职业列表"或"可用副职业列表",则必须:
|
||
- 仔细查看可用的主职业和副职业列表
|
||
- 根据角色的背景、能力、故事定位,选择最合适的职业
|
||
- 主职业:从"可用主职业列表"中选择一个,填写职业名称(name字段)
|
||
- 主职业阶段:根据职业的阶段信息和角色实力,设定合理的当前阶段
|
||
- 副职业:可选择0-2个副职业,每个包含职业名称和阶段
|
||
- ⚠️ 重要:必须填写职业的名称而非ID,系统会自动匹配
|
||
|
||
请严格按照以下JSON格式返回:
|
||
{{
|
||
"name": "角色姓名",
|
||
"age": 25,
|
||
"gender": "男/女/其他",
|
||
"role_type": "supporting",
|
||
"personality": "性格特点的详细描述(100-200字)",
|
||
"background": "背景故事的详细描述(100-200字)",
|
||
"appearance": "外貌描述(50-100字)",
|
||
"traits": ["特长1", "特长2", "特长3"],
|
||
"relationships_text": "用自然语言描述该角色与其他角色的关系网络",
|
||
|
||
"relationships": [
|
||
{{
|
||
"target_character_name": "已存在的角色名称",
|
||
"relationship_type": "关系类型(如:朋友、师父、敌人、父亲等)",
|
||
"intimacy_level": 75,
|
||
"description": "关系的具体描述,说明他们如何认识、关系如何发展",
|
||
"status": "active"
|
||
}}
|
||
],
|
||
"organization_memberships": [
|
||
{{
|
||
"organization_name": "已存在的组织名称",
|
||
"position": "职位",
|
||
"rank": 5,
|
||
"loyalty": 80
|
||
}}
|
||
],
|
||
|
||
"career_info": {{
|
||
"main_career_name": "从可用主职业列表中选择的职业名称",
|
||
"main_career_stage": 5,
|
||
"sub_careers": [
|
||
{{
|
||
"career_name": "从可用副职业列表中选择的职业名称",
|
||
"stage": 3
|
||
}}
|
||
]
|
||
}}
|
||
}}
|
||
|
||
**关系类型参考(从中选择或自定义):**
|
||
- 家族关系:父亲、母亲、兄弟、姐妹、子女、配偶、恋人、亲戚
|
||
- 社交关系:师父、徒弟、朋友、挚友、同学、同事、邻居、知己、酒友
|
||
- 职业关系:上司、下属、合作伙伴、客户、雇主、员工
|
||
- 敌对关系:敌人、仇人、竞争对手、宿敌、死敌
|
||
|
||
**重要说明:**
|
||
1. **relationships数组必填**:至少要有1-3个与已有角色的关系(除非确实没有合理的关联)
|
||
2. **target_character_name必须精确匹配**:只能引用【已有角色】列表中的角色名称
|
||
3. organization_memberships只能引用已存在的组织名称
|
||
4. **数值范围约束**:
|
||
- intimacy_level:-100到100的整数
|
||
* 80-100:至亲、挚友、深爱
|
||
* 50-79:亲密、友好
|
||
* 0-49:一般、普通
|
||
* -1到-49:不和、敌视
|
||
* -50到-100:仇恨、死敌
|
||
- loyalty:0到100的整数(仅用于组织成员)
|
||
- **rank:0到10的整数**(职位等级,0最低,10最高)
|
||
5. status默认为"active",表示当前关系状态
|
||
|
||
**关系建立示例:**
|
||
- 如果新角色是主角的新队友,应该与主角建立"队友"或"朋友"关系
|
||
- 如果新角色是反派的手下,应该与反派建立"上司-下属"关系
|
||
- 如果新角色与某角色有血缘,应该建立家族关系
|
||
|
||
只返回纯JSON对象,不要有```json```这样的标记。"""
|
||
|
||
# 职业体系生成提示词
|
||
CAREER_SYSTEM_GENERATION = """你是专业的游戏/小说职业体系设计师。请根据以下世界观信息,设计一个完整且合理的职业体系。
|
||
|
||
【项目信息】
|
||
- 书名:{title}
|
||
- 类型:{genre}
|
||
- 主题:{theme}
|
||
- 时间背景:{time_period}
|
||
- 地理位置:{location}
|
||
- 氛围基调:{atmosphere}
|
||
- 世界规则:{rules}
|
||
|
||
【设计要求】
|
||
1. **主职业(main_careers)**:
|
||
- 根据世界观特点,决定需要多少个主职业
|
||
- 主职业是角色的核心发展方向,直接影响战斗力或核心能力
|
||
- 必须严格符合世界观规则,体现核心能力体系
|
||
- 每个主职业的阶段数量可以不同:根据职业的复杂度、重要性、修炼难度等因素,为不同职业设定不同的max_stage
|
||
|
||
2. **副职业(sub_careers)**:
|
||
- 根据世界需要,决定需要多少个副职业
|
||
- 副职业包含生产、辅助、特殊技能类,丰富角色的能力维度
|
||
- 每个副职业的阶段数量可以不同:简单的副职业可能只有3-5个阶段,复杂的可能有6-10个阶段
|
||
- 不要让所有副职业都是相同的阶段数
|
||
|
||
3. **阶段设计(stages)**:
|
||
- 每个职业的stages数组长度必须等于max_stage
|
||
- 阶段名称要符合世界观文化背景和时代特征
|
||
- 阶段描述要体现明确的能力提升和成长路径
|
||
- 重要:确保职业间的阶段数量有差异,体现职业的多样性
|
||
|
||
【JSON格式】
|
||
|
||
{{
|
||
"main_careers": [
|
||
{{
|
||
"name": "职业名称",
|
||
"description": "职业描述(100-150字),说明职业特点和定位",
|
||
"category": "职业分类(如:战斗系、法术系、体修系等)",
|
||
"stages": [
|
||
{{"level": 1, "name": "阶段1名称", "description": "阶段描述"}},
|
||
{{"level": 2, "name": "阶段2名称", "description": "阶段描述"}},
|
||
...数组长度应等于max_stage...
|
||
],
|
||
"max_stage": 根据职业复杂度自行决定的整数,
|
||
"requirements": "职业要求和前置条件",
|
||
"special_abilities": "职业特殊能力和特色",
|
||
"worldview_rules": "与世界观规则的关联",
|
||
"attribute_bonuses": {{"strength": "+10%", "intelligence": "+5%"}}
|
||
}}
|
||
],
|
||
"sub_careers": [
|
||
{{
|
||
"name": "副职业名称",
|
||
"description": "职业描述(80-120字)",
|
||
"category": "生产系/辅助系/特殊系",
|
||
"stages": [
|
||
{{"level": 1, "name": "阶段1名称", "description": "阶段描述"}},
|
||
...数组长度应等于max_stage...
|
||
],
|
||
"max_stage": 根据职业特性自行决定的整数,
|
||
"requirements": "职业要求",
|
||
"special_abilities": "特殊能力"
|
||
}}
|
||
]
|
||
}}
|
||
|
||
【重要提示】
|
||
- 职业的数量、类型完全由你根据世界观自行决定,不要受任何数字限制
|
||
- **阶段数量多样性(关键)**:
|
||
- 不同职业的max_stage必须不同,不要所有职业都是相同的阶段数
|
||
- 主职业的阶段数建议范围:5-15个阶段(根据职业重要性和复杂度灵活设定)
|
||
- 副职业的阶段数建议范围:3-10个阶段(根据职业特性灵活设定)
|
||
- 例如:剑修可能有12个阶段,炼丹师可能有8个阶段,体修可能有10个阶段
|
||
- 确保职业体系与世界观高度契合,符合该世界的逻辑和文化
|
||
- 只返回纯JSON,不要添加markdown标记或其他解释文字
|
||
|
||
请让每个职业的阶段数有所不同,体现职业的独特性和多样性!"""
|
||
|
||
@staticmethod
|
||
def format_prompt(template: str, **kwargs) -> str:
|
||
"""
|
||
格式化提示词模板
|
||
|
||
Args:
|
||
template: 提示词模板
|
||
**kwargs: 模板参数
|
||
|
||
Returns:
|
||
格式化后的提示词
|
||
"""
|
||
try:
|
||
return template.format(**kwargs)
|
||
except KeyError as e:
|
||
raise ValueError(f"缺少必需的参数: {e}")
|
||
|
||
|
||
@classmethod
|
||
async def get_chapter_regeneration_prompt(cls, chapter_number: int, title: str, word_count: int, content: str,
|
||
modification_instructions: str, project_context: Dict[str, Any],
|
||
style_content: str, target_word_count: int,
|
||
user_id: str = None, db = None) -> str:
|
||
"""
|
||
获取章节重写提示词(支持用户自定义)
|
||
|
||
Args:
|
||
chapter_number: 章节序号
|
||
title: 章节标题
|
||
word_count: 原始字数
|
||
content: 原始内容
|
||
modification_instructions: 修改指令
|
||
project_context: 项目上下文
|
||
style_content: 写作风格
|
||
target_word_count: 目标字数
|
||
user_id: 用户ID(可选,用于获取自定义模板)
|
||
db: 数据库会话(可选,用于查询自定义模板)
|
||
|
||
Returns:
|
||
完整的章节重写提示词
|
||
"""
|
||
# 获取系统提示词模板(支持用户自定义)
|
||
if user_id and db:
|
||
system_template = await cls.get_template("CHAPTER_REGENERATION_SYSTEM", user_id, db)
|
||
else:
|
||
system_template = cls.CHAPTER_REGENERATION_SYSTEM
|
||
|
||
prompt_parts = [system_template]
|
||
|
||
# 原始章节信息
|
||
prompt_parts.append(f"""## 📖 原始章节信息
|
||
|
||
**章节**:第{chapter_number}章
|
||
**标题**:{title}
|
||
**字数**:{word_count}字
|
||
|
||
**原始内容**:
|
||
{content}
|
||
|
||
---
|
||
""")
|
||
|
||
# 修改指令
|
||
prompt_parts.append(modification_instructions)
|
||
prompt_parts.append("\n---\n")
|
||
|
||
# 项目背景信息
|
||
prompt_parts.append(f"""## 🌍 项目背景信息
|
||
|
||
**小说标题**:{project_context.get('project_title', '未知')}
|
||
**题材**:{project_context.get('genre', '未设定')}
|
||
**主题**:{project_context.get('theme', '未设定')}
|
||
**叙事视角**:{project_context.get('narrative_perspective', '第三人称')}
|
||
**世界观设定**:
|
||
- 时代背景:{project_context.get('time_period', '未设定')}
|
||
- 地理位置:{project_context.get('location', '未设定')}
|
||
- 氛围基调:{project_context.get('atmosphere', '未设定')}
|
||
|
||
---
|
||
""")
|
||
|
||
# 角色信息
|
||
if project_context.get('characters_info'):
|
||
prompt_parts.append(f"""## 👥 角色信息
|
||
|
||
{project_context['characters_info']}
|
||
|
||
---
|
||
""")
|
||
|
||
# 章节大纲
|
||
if project_context.get('chapter_outline'):
|
||
prompt_parts.append(f"""## 📝 本章大纲
|
||
|
||
{project_context['chapter_outline']}
|
||
|
||
---
|
||
""")
|
||
|
||
# 前置章节上下文
|
||
if project_context.get('previous_context'):
|
||
prompt_parts.append(f"""## 📚 前置章节上下文
|
||
|
||
{project_context['previous_context']}
|
||
|
||
---
|
||
""")
|
||
|
||
# 写作风格要求
|
||
if style_content:
|
||
prompt_parts.append(f"""## 🎨 写作风格要求
|
||
|
||
{style_content}
|
||
|
||
请在重新创作时严格遵循上述写作风格。
|
||
|
||
---
|
||
""")
|
||
|
||
# 创作要求
|
||
prompt_parts.append(f"""## ✨ 创作要求
|
||
|
||
1. **解决问题**:针对上述修改指令中提到的所有问题进行改进
|
||
2. **保持连贯**:确保与前后章节的情节、人物、风格保持一致
|
||
3. **提升质量**:在节奏、情感、描写等方面明显优于原版
|
||
4. **保留精华**:保持原章节中优秀的部分和关键情节
|
||
5. **字数控制**:目标字数约{target_word_count}字(可适当浮动±20%)
|
||
{f'6. **风格一致**:严格按照上述写作风格进行创作' if style_content else ''}
|
||
|
||
---
|
||
|
||
## 🎬 开始创作
|
||
|
||
请现在开始创作改进后的新版本章节内容。
|
||
|
||
**重要提示**:
|
||
- 直接输出章节正文内容,从故事内容开始写
|
||
- **不要**输出章节标题(如"第X章"、"第X章:XXX"等)
|
||
- **不要**输出任何额外的说明、注释或元数据
|
||
- 只需要纯粹的故事正文内容
|
||
|
||
现在开始:
|
||
""")
|
||
|
||
return "\n".join(prompt_parts)
|
||
|
||
@classmethod
|
||
def get_inspiration_prompt(cls, step: str) -> Optional[Dict[str, str]]:
|
||
"""获取灵感模式指定步骤的提示词"""
|
||
return cls.INSPIRATION_PROMPTS.get(step)
|
||
|
||
@classmethod
|
||
def get_inspiration_quick_complete_prompt(cls, existing: str) -> Dict[str, str]:
|
||
"""获取灵感模式智能补全的提示词"""
|
||
return {
|
||
"system": cls.format_prompt(cls.INSPIRATION_QUICK_COMPLETE, existing=existing),
|
||
"user": "请补全小说信息"
|
||
}
|
||
|
||
@classmethod
|
||
async def get_mcp_tool_test_prompts(
|
||
cls,
|
||
plugin_name: str,
|
||
user_id: str = None,
|
||
db = None
|
||
) -> Dict[str, str]:
|
||
"""
|
||
获取MCP工具测试的提示词(支持自定义)
|
||
|
||
Args:
|
||
plugin_name: 插件名称
|
||
user_id: 用户ID(可选)
|
||
db: 数据库会话(可选)
|
||
|
||
Returns:
|
||
包含user和system提示词的字典
|
||
"""
|
||
# 获取用户自定义或系统默认的user提示词
|
||
if user_id and db:
|
||
user_template = await cls.get_template("MCP_TOOL_TEST", user_id, db)
|
||
else:
|
||
user_template = cls.MCP_TOOL_TEST
|
||
|
||
# 获取用户自定义或系统默认的system提示词
|
||
if user_id and db:
|
||
system_template = await cls.get_template("MCP_TOOL_TEST_SYSTEM", user_id, db)
|
||
else:
|
||
system_template = cls.MCP_TOOL_TEST_SYSTEM
|
||
|
||
return {
|
||
"user": cls.format_prompt(user_template, plugin_name=plugin_name),
|
||
"system": system_template
|
||
}
|
||
# 创建全局提示词服务实例
|
||
|
||
# ========== 自定义提示词支持 ==========
|
||
|
||
@classmethod
|
||
async def get_template_with_fallback(cls,
|
||
template_key: str,
|
||
user_id: str = None,
|
||
db = None) -> str:
|
||
"""
|
||
获取提示词模板(优先用户自定义,支持降级)
|
||
|
||
Args:
|
||
template_key: 模板键名
|
||
user_id: 用户ID(可选,如果不提供则直接返回系统默认)
|
||
db: 数据库会话(可选)
|
||
|
||
Returns:
|
||
提示词模板内容
|
||
"""
|
||
# 如果没有提供user_id或db,直接返回系统默认
|
||
if not user_id or not db:
|
||
return getattr(cls, template_key, None)
|
||
|
||
# 尝试获取用户自定义模板
|
||
return await cls.get_template(template_key, user_id, db)
|
||
|
||
@classmethod
|
||
async def get_template(cls,
|
||
template_key: str,
|
||
user_id: str,
|
||
db) -> str:
|
||
"""
|
||
获取提示词模板(优先用户自定义)
|
||
|
||
Args:
|
||
template_key: 模板键名
|
||
user_id: 用户ID
|
||
db: 数据库会话
|
||
|
||
Returns:
|
||
提示词模板内容
|
||
"""
|
||
from sqlalchemy import select
|
||
from app.models.prompt_template import PromptTemplate
|
||
from app.logger import get_logger
|
||
|
||
logger = get_logger(__name__)
|
||
|
||
# 1. 尝试从数据库获取用户自定义模板
|
||
result = await db.execute(
|
||
select(PromptTemplate).where(
|
||
PromptTemplate.user_id == user_id,
|
||
PromptTemplate.template_key == template_key,
|
||
PromptTemplate.is_active == True
|
||
)
|
||
)
|
||
custom_template = result.scalar_one_or_none()
|
||
|
||
if custom_template:
|
||
logger.info(f"✅ 使用用户自定义提示词: user_id={user_id}, template_key={template_key}, template_name={custom_template.template_name}")
|
||
return custom_template.template_content
|
||
|
||
# 2. 降级到系统默认模板
|
||
logger.info(f"⚪ 使用系统默认提示词: user_id={user_id}, template_key={template_key} (未找到自定义模板)")
|
||
|
||
# 特殊处理灵感模式的提示词(存储在INSPIRATION_PROMPTS字典中)
|
||
if template_key.startswith("INSPIRATION_"):
|
||
# 提取步骤名称(如 INSPIRATION_TITLE -> title)
|
||
step = template_key.replace("INSPIRATION_", "").lower()
|
||
inspiration_prompt = cls.INSPIRATION_PROMPTS.get(step)
|
||
if inspiration_prompt:
|
||
# 返回JSON格式的提示词
|
||
return json.dumps(inspiration_prompt, ensure_ascii=False)
|
||
# 如果是INSPIRATION_QUICK_COMPLETE
|
||
if template_key == "INSPIRATION_QUICK_COMPLETE":
|
||
return cls.INSPIRATION_QUICK_COMPLETE
|
||
|
||
# 其他模板直接从类属性获取
|
||
template_content = getattr(cls, template_key, None)
|
||
|
||
if template_content is None:
|
||
logger.warning(f"⚠️ 未找到系统默认模板: {template_key}")
|
||
|
||
return template_content
|
||
|
||
@classmethod
|
||
def get_all_system_templates(cls) -> list:
|
||
"""
|
||
获取所有系统默认模板的信息
|
||
|
||
Returns:
|
||
系统模板列表
|
||
"""
|
||
templates = []
|
||
|
||
# 定义所有模板及其元信息
|
||
template_definitions = {
|
||
"WORLD_BUILDING": {
|
||
"name": "世界构建",
|
||
"category": "世界构建",
|
||
"description": "用于生成小说世界观设定,包括时间背景、地理位置、氛围基调和世界规则",
|
||
"parameters": ["title", "theme", "genre", "description"]
|
||
},
|
||
"CHARACTERS_BATCH_GENERATION": {
|
||
"name": "批量角色生成",
|
||
"category": "角色生成",
|
||
"description": "批量生成多个角色和组织,建立角色关系网络",
|
||
"parameters": ["count", "time_period", "location", "atmosphere", "rules", "theme", "genre", "requirements"]
|
||
},
|
||
"SINGLE_CHARACTER_GENERATION": {
|
||
"name": "单个角色生成",
|
||
"category": "角色生成",
|
||
"description": "生成单个角色的详细设定",
|
||
"parameters": ["project_context", "user_input"]
|
||
},
|
||
"SINGLE_ORGANIZATION_GENERATION": {
|
||
"name": "组织生成",
|
||
"category": "角色生成",
|
||
"description": "生成组织/势力的详细设定",
|
||
"parameters": ["project_context", "user_input"]
|
||
},
|
||
"OUTLINE_CREATE": {
|
||
"name": "初始大纲生成",
|
||
"category": "大纲生成",
|
||
"description": "根据项目信息生成完整的章节大纲",
|
||
"parameters": ["title", "theme", "genre", "chapter_count", "narrative_perspective", "target_words",
|
||
"time_period", "location", "atmosphere", "rules", "characters_info", "requirements", "mcp_references"]
|
||
},
|
||
"OUTLINE_CONTINUE": {
|
||
"name": "大纲续写",
|
||
"category": "大纲生成",
|
||
"description": "基于已有章节续写大纲",
|
||
"parameters": ["title", "theme", "genre", "narrative_perspective", "chapter_count", "time_period",
|
||
"location", "atmosphere", "rules", "characters_info", "current_chapter_count",
|
||
"all_chapters_brief", "recent_plot", "memory_context", "mcp_references",
|
||
"plot_stage_instruction", "start_chapter", "end_chapter", "story_direction", "requirements"]
|
||
},
|
||
"OUTLINE_GENERATION": {
|
||
"name": "基础大纲生成",
|
||
"category": "大纲生成",
|
||
"description": "生成基础章节大纲框架",
|
||
"parameters": ["genre", "theme", "target_words", "requirements"]
|
||
},
|
||
"OUTLINE_EXPANSION": {
|
||
"name": "大纲展开",
|
||
"category": "大纲生成",
|
||
"description": "将单个大纲节点展开为多个章节",
|
||
"parameters": ["title", "genre", "theme", "narrative_perspective", "time_period", "location",
|
||
"atmosphere", "rules", "characters_info", "outline_order", "outline_title",
|
||
"outline_content", "context_info", "strategy_instruction", "target_chapters",
|
||
"scene_instruction", "scene_field"]
|
||
},
|
||
"CHAPTER_GENERATION": {
|
||
"name": "章节创作",
|
||
"category": "章节创作",
|
||
"description": "根据大纲创作章节内容",
|
||
"parameters": ["title", "theme", "genre", "narrative_perspective", "time_period", "location",
|
||
"atmosphere", "rules", "characters_info", "outlines_context", "chapter_number",
|
||
"chapter_title", "chapter_outline", "target_word_count", "max_word_count"]
|
||
},
|
||
"CHAPTER_GENERATION_WITH_CONTEXT": {
|
||
"name": "章节创作(带上下文)",
|
||
"category": "章节创作",
|
||
"description": "基于前置章节内容创作新章节",
|
||
"parameters": ["title", "theme", "genre", "narrative_perspective", "time_period", "location",
|
||
"atmosphere", "rules", "characters_info", "outlines_context", "previous_content",
|
||
"memory_context", "chapter_number", "chapter_title", "chapter_outline",
|
||
"target_word_count", "max_word_count"]
|
||
},
|
||
"CHAPTER_REGENERATION_SYSTEM": {
|
||
"name": "章节重写系统提示",
|
||
"category": "章节重写",
|
||
"description": "用于章节重写的系统提示词",
|
||
"parameters": ["chapter_number", "title", "word_count", "content", "modification_instructions",
|
||
"project_context", "style_content", "target_word_count"]
|
||
},
|
||
"AI_DENOISING": {
|
||
"name": "AI去味",
|
||
"category": "辅助功能",
|
||
"description": "将AI生成的文本改写得更自然",
|
||
"parameters": ["original_text"]
|
||
},
|
||
"PLOT_ANALYSIS": {
|
||
"name": "情节分析",
|
||
"category": "情节分析",
|
||
"description": "深度分析章节的剧情、钩子、伏笔等",
|
||
"parameters": ["chapter_number", "title", "content", "word_count"]
|
||
},
|
||
"OUTLINE_EXPAND_SINGLE": {
|
||
"name": "大纲单批次展开",
|
||
"category": "情节展开",
|
||
"description": "将大纲节点展开为详细章节规划(单批次)",
|
||
"parameters": ["project_title", "project_genre", "project_theme", "project_narrative_perspective",
|
||
"project_world_time_period", "project_world_location", "project_world_atmosphere",
|
||
"characters_info", "outline_order_index", "outline_title", "outline_content",
|
||
"context_info", "strategy_instruction", "target_chapter_count", "scene_instruction", "scene_field"]
|
||
},
|
||
"OUTLINE_EXPAND_MULTI": {
|
||
"name": "大纲分批展开",
|
||
"category": "情节展开",
|
||
"description": "将大纲节点展开为详细章节规划(分批)",
|
||
"parameters": ["project_title", "project_genre", "project_theme", "project_narrative_perspective",
|
||
"project_world_time_period", "project_world_location", "project_world_atmosphere",
|
||
"characters_info", "outline_order_index", "outline_title", "outline_content",
|
||
"context_info", "previous_context", "strategy_instruction", "start_index",
|
||
"end_index", "target_chapter_count", "scene_instruction", "scene_field"]
|
||
},
|
||
"MCP_TOOL_TEST": {
|
||
"name": "MCP工具测试(用户提示词)",
|
||
"category": "MCP测试",
|
||
"description": "用于测试MCP插件功能的用户提示词",
|
||
"parameters": ["plugin_name"]
|
||
},
|
||
"MCP_TOOL_TEST_SYSTEM": {
|
||
"name": "MCP工具测试(系统提示词)",
|
||
"category": "MCP测试",
|
||
"description": "用于测试MCP插件功能的系统提示词",
|
||
"parameters": []
|
||
},
|
||
"MCP_WORLD_BUILDING_PLANNING": {
|
||
"name": "MCP世界观规划",
|
||
"category": "MCP增强",
|
||
"description": "使用MCP工具搜索资料辅助世界观设计",
|
||
"parameters": ["title", "genre", "theme", "description"]
|
||
},
|
||
"MCP_CHARACTER_PLANNING": {
|
||
"name": "MCP角色规划",
|
||
"category": "MCP增强",
|
||
"description": "使用MCP工具搜索资料辅助角色设计",
|
||
"parameters": ["title", "genre", "theme", "time_period", "location"]
|
||
},
|
||
"AUTO_CHARACTER_ANALYSIS": {
|
||
"name": "自动角色分析",
|
||
"category": "自动角色引入",
|
||
"description": "分析新生成的大纲,判断是否需要引入新角色",
|
||
"parameters": ["title", "genre", "theme", "time_period", "location", "atmosphere",
|
||
"existing_characters", "new_outlines", "start_chapter", "end_chapter"]
|
||
},
|
||
"AUTO_CHARACTER_GENERATION": {
|
||
"name": "自动角色生成",
|
||
"category": "自动角色引入",
|
||
"description": "根据剧情需求自动生成新角色的完整设定",
|
||
"parameters": ["title", "genre", "theme", "time_period", "location", "atmosphere", "rules",
|
||
"existing_characters", "plot_context", "character_specification", "mcp_references"]
|
||
},
|
||
"CAREER_SYSTEM_GENERATION": {
|
||
"name": "职业体系生成",
|
||
"category": "世界构建",
|
||
"description": "根据世界观自动生成完整的职业体系,包括主职业和副职业",
|
||
"parameters": ["title", "genre", "theme", "time_period", "location", "atmosphere", "rules"]
|
||
}
|
||
}
|
||
|
||
for key, info in template_definitions.items():
|
||
template_content = getattr(cls, key, None)
|
||
if template_content:
|
||
templates.append({
|
||
"template_key": key,
|
||
"template_name": info["name"],
|
||
"category": info["category"],
|
||
"description": info["description"],
|
||
"parameters": info["parameters"],
|
||
"content": template_content
|
||
})
|
||
|
||
return templates
|
||
|
||
@classmethod
|
||
def get_system_template_info(cls, template_key: str) -> dict:
|
||
"""
|
||
获取指定系统模板的信息
|
||
|
||
Args:
|
||
template_key: 模板键名
|
||
|
||
Returns:
|
||
模板信息字典
|
||
"""
|
||
all_templates = cls.get_all_system_templates()
|
||
for template in all_templates:
|
||
if template["template_key"] == template_key:
|
||
return template
|
||
return None
|
||
prompt_service = PromptService() |