小说工坊 · dsh-novel-generator
中文 · English
DSH 的常驻插件:在时间线上写小说。每个作品绑定一个普通会话,章节正文与世界快照都由那个会话里的 Agent 生成,全部内容以 Markdown 存在你的工作目录里。
截图
| |
|---|
| 作品列表 | 时间长河 |
| 作品列表:每行「模型 / 预设 / 前置 / 设置 / 提示词 / 导入章节 / 重建会话 / 改目录 / 删除」 | 时间长河与世界快照 |
| 章节故事 | 章节大纲 |
| 章节故事页:同步章节大纲、提取行文风格、AI 修改 | 章节大纲页:梗概、字数范围、时间长度、AI 修改梗概 |
四张图也在 screenshots.json 里声明了顺序,插件市场详情页按此展示。
功能一览
| 位置 | 能做什么 |
|---|
| 作品列表 | 创建 / 打开 / 删除作品;给单个作品换模型、预设、前置提示词、设置、导入章节、重建会话、改目录 |
| 时间长河 | 拖动时间线看任意时刻的世界观、角色、势力、关系、物品、事件;改快照间隔;生成 / 重新生成 / 重置世界快照;每章天数统计图 |
| 章节故事 | 编辑正文并保存;同步章节大纲;提取行文风格;AI 修改正文 |
| 章节大纲 | 改标题、时间长度、字数上下限、梗概与梗概最低字数;自动推演;生成章节故事;AI 修改梗概 |
| 作品设置 | 前文参考程度(前一章全文 / 后一半 / 不参考) |
| 提示词一览 | 只读查看插件发送的 9 个提示词模块 |
安装
dsh plugin --profile web add dsh-novel-generator
# 或直接装仓库:dsh plugin --profile web add https://github.com/XiaoOu2024/dsh-novel-generator
也可以在 DSH 的 设置 → 插件 里安装。装好后刷新页面,界面左下角出现「小说工坊」按钮。
需要 DeepSeek Harness 0.2.1-rc.2 或更新的 0.2.x:插件调用 sessionController(create / selectModel / prompt / resolveAgent)、workspaceRegistry(create / resolveByPath / attachSession)与 agentPresets,这些在 0.2.1 之前不存在或不稳定。依赖以 peerDependencies: { "@deepseek-ai/dsh": "^0.2.1-rc.2" }(optional)声明。
打开方式
界面左下角(设置按钮旁)的 小说工坊 按钮,点开即作品管理界面;右上角「关闭」退出。
使用流程
- 创建作品:选工作目录(只能通过「选择」调系统目录选择器,不能手填)、模型、预设。创建动作本身会调用
sessionController.create 开一个会话,作品与会话一对一;会话照常出现在左侧列表,可以直接进去对话。
- 写大纲:进入作品 → 时间长河 → 「章节大纲」填梗概、字数范围、故事时间长度。可以「创建空章节」,也可以「自动推演」一次拿到梗概、标题与完整正文。
- 生成正文:大纲保存后点「生成章节故事」。
- 结算快照:故事推进到网格点时自动生成世界快照,也可以手动生成、重新生成或重置。
未保存保护:正文或大纲有未保存修改时,任何离开动作(回时间线、翻章、进大纲、回列表、关闭工作室)都会先确认,可选「不保存离开 / 保存并离开」;大纲不完整时保存会被拒绝并提示。
世界快照怎么来
- 时间线以「天」计(0 = 创建作品那天)。「快照间隔」(7 / 15 / 30 / 90 / 180 / 365 天,可手输)决定一条网格:第 15、30、45… 天。
- 手动:把时间线拖到网格点上,标题栏出现「生成世界快照 · 第 N 天」;该点已有快照时变成「重新生成快照」,会替换旧的那份。都先弹确认。
- 自动:只要故事时间被推进到新的网格点就触发——新建章节(含只有大纲的空章节)、自动推演、生成正文、手动保存正文都算。判定幂等:已存在的点不会被普通保存重复生成。
- 每个点收录哪些章节(
[上一份快照日, 本点) 半开区间):
- 只收录结束时间严格早于本点的章节——结束在本点那一天的那一章不算,它正是这次快照要为之而拍的那段;
- 也不收录上一份快照已收录过的章节,所以每一章恰好被一份快照收录一次。
- 例:间隔 30、章节各 10 天 → 第 30 天快照收录第 1、2 章;第 60 天快照收录第 3、4、5 章。
- 空段落点不调用模型:某个点没有可收录的章节时(例如一章占满整个间隔),直接沿用上一版快照并注明,既省一次调用,也避免模型凭空编造世界设定——那会污染后续所有章节。
- 同一部作品同一时间只跑一个快照任务。
- 重置:时间线右上角「重置快照」清空全部快照,再按当前间隔从第 1 格重建到故事末端。
- 物品 / 事件:快照除世界观、角色、势力、关系外,还有物品(名称 + 下落/用途)和事件(故事天数 + 标题 + 一句话),事件按时间从新到旧。
- 生成依据:先找本章之前最近的那份快照。若「本章起始日 − 快照落点 > 当前间隔」,判定过旧,直接拒绝并提示先去更新快照;否则自动推演用「最近快照 + 快照落点之后、本章之前各章梗概」,写正文再加一段「待生成的本章梗概」。
章节故事页
- 正文可直接编辑、保存。工具条上还有三个按钮:
- 同步章节大纲:把当前正文交给模型,按这一章的实际内容重算整份大纲——梗概、故事时间长度、最低字数、最多字数、梗概最低字数,然后保存覆盖旧大纲(正文不动)。
- 字数范围一定把正文实际字数包在里面;梗概下限不超过新梗概本身的长度。
- 提取行文风格:模型读这一章,提炼视角与人称、句式、用词、节奏、描写比例,输出条目式说明(≤600 字)。
- 分析期间整个工坊被锁定;正文不足 300 字时按钮不可点,接口返回 400。
- 完成后弹面板:只读文本 +「复制」+「写入前置」。「写入前置」会先确认并说明要用 AI 整理:模型把这段风格与你现有前置合并成一段统一约束(≤2000 字)后保存。
- AI 修改:填修改意见,模型按意见重写整章;结果只放进编辑区,不自动保存。
- 正文为空时按钮不可点,接口也返回 400;修改意见为空同样拒绝。
时间线顺移(重要)
只要「故事时间长度(天)」发生变化,后面所有章节的起始日都会整体顺移,保持首尾相接。触发场景:
- 在大纲页手动改时间长度并保存;
- 同步章节大纲(模型测出的天数被采纳);
- 导入章节时勾选「自动同步章节大纲」;
- 对已有章节重新自动推演。
顺移后弹窗列出每章的新位置,并提示:世界快照不会跟着移动,请到时间长河把受影响的落点重新生成。
章节大纲页
- 自动推演:先问「将覆盖现有内容」,确认后按当前字数与时间长度重新生成梗概 + 标题 + 整章正文并保存。作品的第一章没有快照和上一章可依据,禁用。
- 生成章节故事:先问「是否以当前故事梗概生成故事」,确认后重写正文。
- AI 修改梗概:只改故事梗概,依据是「原梗概 + 你的修改意见」,不动正文与标题;结果填回梗概框并标记未保存。
刻意的差别:「同步章节大纲」会覆盖保存(读的是已写定的正文);「AI 修改梗概」只改草稿(它改的正是你用来生成正文的依据)。
前文参考程度(作品设置)
作品列表每行的「设置」,控制自动推演与生成章节故事时带多少前文:
| 选项 | 提示词里带什么 |
|---|
| 前一章(全文)(默认) | 上一章整章正文,用来接住语气、场景与最后一句 |
| 前一章的后一半 | 从上一章中间那句话开始给到结尾 |
| 不参考正文 | 只靠世界快照与各章梗概推进 |
- 上一章正文超过 8000 字时只取最后 8000 字(衔接看结尾)。
- 「上一章」按起始日排序取本章之前最近的一章;它没有正文时该块省略。
- 参考块出现在「已发生的章节梗概」之后、「本章梗概」之前。
- 同步大纲、提取风格、世界快照不带前文正文(测量/结构化任务,带前文只会干扰判断)。
前置提示词(作品级)
作品列表每行的「前置」给一本书设定前置:内置「第三人称全知(默认)/ 第三人称限知 / 第一人称 / 自定义」,选中即填入文本框,可自由改写(最多 2000 字)。新建作品默认带「第三人称全知」那段 6 条,可以直接改或清空。
- 生成正文、自动推演、AI 修改正文、AI 修改梗概、提取行文风格、整理前置时,这段文本以「【本书前置设定】…」放在提示最前面;世界快照与同步大纲不带。
- 保存后下一次生成就生效,不必重建会话。
- 同时写进
作品信息.md 文末,便于外部查看与备份。留空即不设置。
导入章节
作品列表每行的「导入章节」把现成的 .md 导进作品:选来源 → 看匹配结果 → 确认。
- 认
第1章、第007章、第十二章 三种编号,后缀也可以是 回 / 节;扩展名 .md / .markdown / .txt;
- 从选定起点按
1, 2, 3…(或「上一章编号 + 1」)顺序配对,配不上就停,后面的文件不导入;
- 起点选「从第 1 章开始」时,作品里已占用的章号会跳过(不覆盖、不重复);
- 标题取编号之后的部分(
第3章.md 没有标题,用「第 3 章」)。
- 匹配结果显示:将导入的每一条(
文件名 → 第N章 标题 · 字数)、被跳过的章号、没连上的文件、认不出章号的文件、疑似乱码标记。
- 导入后正文写进作品并导出成
第NN章 标题.md;勾选「自动同步章节大纲」时逐章调用模型(进度可见、可停止);推进到网格点会顺带触发世界快照。导入时填的「每章天数」是初值,同步后以模型实测值为准并顺移后续章节。
提示词一览(只读)
作品列表每行的「提示词」打开只读面板,列出插件会发送的 9 个提示词模块,每块标明触发时机,可复制全文:
| 模块 | 什么时候发 |
|---|
| 本书前置设定 | 写正文 / 自动推演 / AI 修改正文 / AI 修改梗概 / 提取行文风格 / 整理前置 |
| 写章节正文 | 「生成章节故事」,或「自动推演」的写正文一步 |
| 自动推演大纲 | 「自动推演」 |
| 世界快照 | 「生成世界快照」或自动触发 |
| 同步章节大纲 | 「同步章节大纲」或导入时自动同步 |
| AI 修改正文 / AI 修改梗概 | 两个「AI 修改」 |
| 提取行文风格 / 整理进前置 | 两个风格相关按钮 |
- 只读,活数据用
{…} 占位:面板不读取、也不回显你作品里的真实内容。
- 渲染方式:Host 用一份占位数据(虚构章节与快照)跑真实的提示词构造函数,结构与实际发出去的逐行一致,不会随代码演进而过期。
- 面板会跟随作品状态走同一分支:作品还没有快照时显示「(暂无世界快照…)」与「开篇到上一章」;有快照时以该作品最新快照日为起点。
- 底部显示当前设置摘要(前文参考程度、前置是否已设置、快照间隔、最新快照日)。
「小说工坊 · 作者」预设(随主插件一起装)
本插件把配套包 dsh-novel-author-preset 列为依赖,cordis.patch.yml 因此声明两行:
| 插件列表里的行 | 是什么 |
|---|
dsh-novel-generator(小说工坊) | 工坊本体:时间线、章节、快照、前置提示词 |
dsh-novel-author-preset(小说工坊 · 作者预设) | Agent 预设:激活时注册,关掉即注销 |
- 两行都挂在小说工坊下面,可分别启停:关掉预设行只是把它从预设列表隐藏,工坊照常工作;关掉工坊本体,预设随之消失。
- 预设行显示的是配套包自己的标题与说明,而不是
@deepseek-ai/dsh-agent-preset 的通用文案。
- 装了它之后新建作品默认用这个预设;预设被关掉或缺席时,重建会话自动退回 profile 默认预设,作品不会坏。
预设内容刻意做得很薄:三句人设(你是小说写作者/只输出正文/文风视角篇幅以用户要求为准)+ 关闭运行时上下文 + 不挂任何工具 + 只保留上下文压缩。所有文学倾向交给作品级前置提示词。
数据存放
-
索引:<DSH_HOME>/novel-studio/projects/<项目id>/project.json(DSH_HOME 缺省 ~/.dsh)。时间线、大纲、快照字段都记在这里;dataDir 配置可改位置。
-
正文、梗概、快照全部写到工作目录下以作品名命名的文件夹里:
<工作目录>/<作品名称>/
├── 作品信息.md 作品参数总览 + 章节一览表 + 前置提示词
├── 第01章 章节名.md 章节正文(纯正文)
├── 章节大纲/
│ ├── 第01章 章节名.md 梗概 + 时间跨度 + 字数上下限 + 实际字数
│ └── .history/ 梗概被改短前的旧版本(每章最多 5 份)
└── 世界快照/
└── 第030天.md 世界观 / 角色 / 势力 / 关系 / 物品 / 事件 / 阶段变化
- 保存正文、生成章节、保存大纲、结算快照都会同步刷新这些文件;改标题会删掉旧文件名。
- 在编辑器里直接改正文
.md 且比插件记录更新时,下次打开以文件为准(梗概与快照是单向导出)。
- 梗概是自由文本,可以自带 Markdown 小标题;
## 故事梗概 之后到文件结尾都算梗概正文。
-
作品名称就是文件夹名,受文件名规则限制:不能为空、最多 60 字、不能以空格或点开头结尾、不能含 \ / : * ? " < > | 与控制字符、不能用 CON/NUL/COM1 等保留名。创建界面即时校验。
-
HTTP 接口前缀 /dsh-novel-generator/api,只接受本机页面同源请求。
-
异步任务:POST /generate、/compose、/deduce、/snapshot/refresh、/chapter/sync-outline、/style/extract、/style/apply、/import/apply 返回 jobId,再由 GET /job?id= 轮询;/job/cancel 取消。
-
timeline.cursor 以「天」为单位;旧数据(按格计数)首次读取时自动换算并标记 cursorUnit: "day"。
迁移、导入与会话
- 改预设:改的是「下次建会话时用哪个预设」;要立刻生效点「重建会话」。
- 改目录:把整个作品文件夹搬到新目录,
cwd 随之更新;目标目录已有同名非空文件夹时拒绝。
- 导入已有作品:列表上方的「导入已有作品…」选中含
作品信息.md 的文件夹,插件从文件重建条目(章节、大纲、梗概、字数、时长、快照)并新建会话。这既是迁移入口,也是 ~/.dsh/novel-studio 数据丢失后的恢复路径。
- 会话:作品与会话一对一。会话被删除时自动重建;被归档时探测不到(DSH 无查询接口),用「重建会话」手动换一个。每次任务前会把会话模型与作品记录的模型对齐。
- 侧栏分组:DSH 分组按目录归属,所以不同工作目录的作品各有一个「小说工坊 · 目录名」分组;空分组与临时目录残留会被自动清理。
多语言
界面语言跟随 DSH 设置 → 通用 → 语言(客户端已接 ctx.locale 与 useTranslator())。侧栏入口、工作室标题栏与载入提示已可切换;其余文案仍是中文,逐条改造留待后续。
自检脚本(开发用,不随包发布)
node selfcheck.mjs <临时工作目录> # 创建/时间线/章节/大纲/保存/删除
node selfcheck-generate.mjs <临时工作目录> # 真实调用模型生成一章
node selfcheck-snapshot.mjs <临时工作目录> # 真实调用模型产出一份世界快照
node selfcheck-compose.mjs <临时工作目录> # 自动推演整章并验证快照阈值触发
默认访问 http://127.0.0.1:3080,仅用于本机验证。
市场投稿条目
awesome-dsh-plugin 的条目 data/plugins/XiaoOu2024__dsh-novel-generator.yml:
url: https://github.com/XiaoOu2024/dsh-novel-generator
name: XiaoOu2024/dsh-novel-generator
category: ui
description:
en: 'Novel generator: builds a world snapshot along a story timeline and, from the latest snapshot and the most recent chapters, deduces the next chapter.'
zh: '小说生成器:按时间线生成世界快照,通过世界快照和最近章节自动推演新章节。'
投稿前需要:仓库已推送、创建满 1 天、仓库设置 dsh-plugin topic。
许可
MIT