包含: - 核心配置文件(AGENTS.md, SOUL.md, USER.md等) - 记忆系统(memory/文件夹) - 技能库(skills/文件夹) - 小说内容(novel/文件夹) - .gitignore配置
195 lines
6.6 KiB
Python
195 lines
6.6 KiB
Python
"""
|
||
Chapter Writer - Core writing logic with segmentation
|
||
"""
|
||
import os
|
||
import json
|
||
from pathlib import Path
|
||
|
||
def get_prompt_template(prompt_name):
|
||
"""Load prompt template from prompts.md"""
|
||
prompts_path = Path(__file__).parent.parent / "references" / "prompts.md"
|
||
# 这里简化处理,实际使用时需要解析markdown
|
||
# 为演示目的,返回简化版本
|
||
return f"Template for {prompt_name}"
|
||
|
||
def generate_chapter_detailed_outline(chapter_num, chapter_title, chapter_summary,
|
||
target_words, previous_chapter_content,
|
||
main_outline, worldbuilding):
|
||
"""Generate detailed outline for a chapter"""
|
||
|
||
prompt = f"""
|
||
【输入】
|
||
上一章小说正文:
|
||
{previous_chapter_content}
|
||
|
||
本章初步大纲(来自章节规划):
|
||
第{chapter_num}章 {chapter_title}
|
||
{chapter_summary}
|
||
|
||
主线大纲参考:
|
||
{main_outline}
|
||
|
||
世界观设定参考:
|
||
{worldbuilding}
|
||
|
||
【任务】
|
||
请仔细阅读正文和大纲,分析和记住剧情、人物、人物关系和性格。现在续接剧情、设定、人物性格,写第{chapter_num}章《{chapter_title}》的详细大纲。
|
||
|
||
【要求】
|
||
1. 支持写成正文字数{target_words}字以上
|
||
2. 这个大纲是提交给大语言模型让它自动生成的
|
||
3. 写的是详细大纲,不是正文
|
||
4. 遵循网文写作规律,节奏紧凑,爽点明确
|
||
|
||
【输出格式】
|
||
第{chapter_num}章 {chapter_title} 详细大纲
|
||
|
||
【章节核心逻辑】
|
||
- 本章核心冲突/目标
|
||
- 人物动机和行动逻辑
|
||
- 与前后章的衔接关系
|
||
- 情绪走向
|
||
|
||
【分幕大纲详细设定】
|
||
(将本章分为3-5幕,每幕包含字数分配)
|
||
|
||
第一幕:【幕标题】(约1200字)
|
||
环境描写:
|
||
...
|
||
人物状态:
|
||
...
|
||
|
||
【正文写作指导】
|
||
- 人物刻画要点
|
||
- 场景描写重点
|
||
- 对话风格指引
|
||
- 卡点/高潮安排
|
||
"""
|
||
return prompt
|
||
|
||
def write_chapter_segment(chapter_title, segment_num, total_segments,
|
||
previous_content, detailed_outline_segment,
|
||
written_so_far="", target_words=2000):
|
||
"""Write one segment of a chapter"""
|
||
|
||
if segment_num == 1:
|
||
# First segment - includes previous chapter
|
||
prompt = f"""
|
||
【输入】
|
||
上一章小说正文:
|
||
{previous_content}
|
||
|
||
本章详细大纲(第一部分):
|
||
{detailed_outline_segment}
|
||
|
||
【任务】
|
||
仔细阅读之前的所有小说正文和详细大纲,分析和记住剧情、人物、人物关系和性格。现在续接剧情、设定、人物性格,写《{chapter_title}》的第一部分正文。
|
||
|
||
【要求】
|
||
1. 字数要求:{target_words}字以上
|
||
|
||
---------要求---------
|
||
1. 严格按照设定和大纲来写,要和前面内容接续,并且不能有矛盾和重复的地方
|
||
2. ****特别注意****不可以自行添加设定和伏笔,也不可以写超出我给的这一段剧情大概内容的剧情
|
||
3. 注意这是小说,不要用说明书式的文字来写正文,要用充满代入感的电影画面一样的描述来写
|
||
4. 不要过度使用各种修辞来描述角色的每一个动作或者言语
|
||
5. 正文中该简洁的时候简洁,该详细描述的详细描述
|
||
6. 确保你写的正文跟前文没有重复描写,重复修饰,重复情节,重复比喻这类重复问题
|
||
7. 要尽可能避免AI味,如过度表情描写和比喻描写,过度进行解释描写,不需要每个逻辑都解释的十分清晰
|
||
8. 注意阅读感受不要写的过于诗意
|
||
9. 注意文笔上,短句不要太多了,不要太过于追求精简和角色体验描述了。不能缺少适当的第三方视角描述,就是那种镜头感
|
||
10. 需要满足字数要求
|
||
"""
|
||
else:
|
||
# Subsequent segments
|
||
prompt = f"""
|
||
【输入】
|
||
已生成的前文:
|
||
{written_so_far}
|
||
|
||
本章详细大纲(第{segment_num}部分):
|
||
{detailed_outline_segment}
|
||
|
||
【任务】
|
||
现在生成了前面的正文,仔细阅读正文,分析和记住描写细节,现在续接剧情、设定、人物性格,写下面部分的正文。
|
||
|
||
【要求】
|
||
1. 字数要求:{target_words}字以上
|
||
|
||
---------要求---------
|
||
(同上...)
|
||
"""
|
||
|
||
return prompt
|
||
|
||
def quality_check_prompt(previous_chapter, current_chapter):
|
||
"""Generate quality check prompt"""
|
||
prompt = f"""
|
||
【输入】
|
||
上一章小说正文:
|
||
{previous_chapter}
|
||
|
||
最新一章小说正文:
|
||
{current_chapter}
|
||
|
||
【任务】
|
||
现在逐句阅读最新一章小说正文全文:
|
||
|
||
1. 帮我优化文笔,去除AI味
|
||
2. 在小说描写中不要过度解释,适当留白,但是也不不可以一味追求简约,要张弛有度
|
||
3. 不要过度表情、心理描写和比喻描写,注意是不要过度,不是一点不能有
|
||
4. 不要过度使用各种修辞来描述角色的每一个动作或者言语
|
||
5. 不要整个段落看起来像是在做说明
|
||
6. 整体来说不要过于追求简短描述,要松弛有度
|
||
7. 最后你不用直接修改全文,而是把有问题的地方重写贴入原文,要求替代内容可以直接复制粘贴到原文中使用
|
||
8. 注意文笔上,短句不要太多了,不要太过于追求精简和角色体验描述了。不能缺少适当的第三方视角描述
|
||
9. 检查一下逻辑是否有问题
|
||
|
||
【输出】
|
||
如果认为需要修改:
|
||
【第X段】原内容:...\n【修改建议】:...
|
||
|
||
如果认为不需要修改:
|
||
QUALITY_PASS
|
||
"""
|
||
return prompt
|
||
|
||
def parse_detailed_outline(outline_text):
|
||
"""Parse detailed outline to extract segments"""
|
||
segments = []
|
||
lines = outline_text.split('\n')
|
||
current_segment = {"title": "", "content": [], "target_words": 0}
|
||
|
||
for line in lines:
|
||
if "第一幕" in line or "第二幕" in line or "第三幕" in line or "第四幕" in line or "第五幕" in line:
|
||
if current_segment["content"]:
|
||
segments.append(current_segment)
|
||
current_segment = {
|
||
"title": line.strip(),
|
||
"content": [],
|
||
"target_words": extract_word_count(line)
|
||
}
|
||
else:
|
||
current_segment["content"].append(line)
|
||
|
||
if current_segment["content"]:
|
||
segments.append(current_segment)
|
||
|
||
return segments
|
||
|
||
def extract_word_count(line):
|
||
"""Extract word count from line like '(约1200字)'"""
|
||
import re
|
||
match = re.search(r'约?([\d,]+)字', line)
|
||
if match:
|
||
return int(match.group(1).replace(',', ''))
|
||
return 2000 # default
|
||
|
||
def estimate_segments(total_words):
|
||
"""Estimate how many 2000-word segments needed"""
|
||
return (total_words + 1999) // 2000 # Round up
|
||
|
||
if __name__ == "__main__":
|
||
print("Chapter Writer Module")
|
||
print("Usage: Import and use functions, not standalone")
|