novel-doomsday-resurgence/skills/fanfic-writer/scripts/chapter_writer.py

195 lines
6.6 KiB
Python
Raw Permalink Normal View History

"""
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")