novel-doomsday-resurgence/skills/fanfic-writer/scripts/chapter_writer.py
唐天洛 cb9b16e5a8 初始提交:番茄小说创作工作区
包含:
- 核心配置文件(AGENTS.md, SOUL.md, USER.md等)
- 记忆系统(memory/文件夹)
- 技能库(skills/文件夹)
- 小说内容(novel/文件夹)
- .gitignore配置
2026-03-30 15:46:26 +08:00

195 lines
6.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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