Files
MuMuAINovel/backend/app/services/prompt_service.py
T

2218 lines
87 KiB
Python
Raw 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.
"""提示词管理服务"""
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的整数(负值表示敌对仇恨关系)
- loyalty0到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()