bigscientist/LLM-for-novel-with-history-and-superheroines ↗★ 0

dsh-preset-novel

小说创作模式 —— a DSH agent preset for long-form literary collaboration: four task-routed skills (novel prose / source research / appreciation essays / play-within-play), a deterministic novel_project project scanner, and a 戏中戏 rule that in-world artifacts must really be built. 适合小说创作者,通过任务路由技能和项目扫描器规范长篇写作纪律。

Package
dsh-preset-novel
Compatibility
Unverified
Version
1.0.0
License
MIT
Last updated
Sep 19, 2026

Install

This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗

dsh-preset-novel · 小说创作模式

一个给 DeepSeek Harness 用的 agent preset: 面向长篇文学创作与续写——不是"帮你写小说"的提示词包,而是一套按任务切换的写作纪律, 加一个确定性的项目扫描器,加一条"小说里人物造的东西必须真做出来"的硬规矩。

英文说明见 README.en.md;开发与设计说明见 docs/DEVELOPING.md。

生成示例见https://huggingface.co/datasets/MARK18964758/LLM_for_novel_with_history_and_superheroines

它解决什么

用大模型续写长篇,出问题的地方从来不是"写不出来",而是这几类:

  • 它不知道自己该写什么。 一会儿写正文,一会儿写赏析,一会儿写人物档案,三种文字混成一片。
  • 它把痕迹留在成品里。 正文里出现"我把 X 放在这里是为了……",或者人物"先做了个错的、后来才做成对的"——那是修改记录,不是小说。
  • 它把该做的东西描述一遍就算做完了。 人物在小说里写了个程序、做了个模式、画了张三维图,它写一段字形容那个程序,而不是把程序写出来。
  • 它不查就写。 真实的城市、店名、路线、价格、职务,凭印象编。
  • 它一次总结一步。 把整本书切给多个子代理精读,回来一份总结一份——最后漏掉的正是最晚到的那一份。

这个 preset 把上面每一条都变成一条可执行的规矩,并且按任务分给四份技能,而不是塞一大段提示词。


装

这个 preset 不是 Cordis 插件,没有"加一行"这回事。DSH 的 agent-presets 服务从 $DSH_HOME/.agent-presets/ 下按目录发现 preset,所以"安装"= 把这个 preset 的目录放到那儿。

一键(Windows PowerShell)

git clone https://github.com/CHANGE-ME/dsh-preset-novel.git
cd dsh-preset-novel
./install.ps1

装到 %USERPROFILE%\.dsh\.agent-presets\novel\。选项:

参数作用
-DshHome D:\dsh装到别的 DSH home
-Link用 junction 代替复制(就地编辑生效)
-Force覆盖已有安装

脚本只把 preset 该有的文件拷进去(preset.yml、agent.cordis.yml、project-scan.js、PRESET.md、skills/), README、LICENSE、package.json 这些发布用的东西不会进 preset 目录。

手动

把下面这些放进 /.agent-presets/novel/:

/.agent-presets/novel/
├── preset.yml          显示名与描述
├── agent.cordis.yml    组合:19 行插件
├── project-scan.js     novel_project 工具
├── PRESET.md           就地维护说明
└── skills/             四份技能
    ├── novel-prose/
    ├── source-research/
    ├── appreciation-craft/
    └── play-within-play/

装完要重启 dsh。 preset 目录在进程启动时被扫描。然后在新建会话里选「小说创作模式」。


用

进去之后它只做一件事:问你要项目文件夹。路径给它,它用 novel_project 扫一遍,把子文件夹 模糊匹配到四类角色请你确认——它不自己挑目录。

四类角色是什么
底本已完成、待续的正文
待写正文新写的章节
资料查来的真实材料
赏析与总结人物档案、情节梗概、结构清单、索引

若发现「戏中戏」子文件夹(小说世界里某个人物自己写的东西),它不塞进这四类,单独列出来请你定夺。


四份技能,按任务切换

这是这个 preset 的主要设计。它不是一个流程,是四份技能;每次接到任务先判类别,再加载对应的那一份。 四份各管一头,读错等于没读。

任务技能管什么
写小说正文(一章)novel-prose一章的形态与篇幅、章内不许有的东西、节奏、现实细节核证、对话的长度与自然度、外语原文加译
查资料/落资料/整理既有章节source-research联网核实的纪律、来源标注、资料档与分析档分家、大文本量分工且等齐再汇总、索引体例
写赏析、随笔、评论、序跋appreciation-craft读者是"被打动的读者"不是审稿人、不许有写作说明与 AI 口癖、素材来源分家、成稿清理清单
写人物自己写的作品play-within-play力所能及范围内必须真做出来、三层结构不许互借、正文与实物体量必须对得上

切换的判据是"这次交付的东西是什么",不是"这次提到了什么"。 为小说做背景调查,交付是资料 → 查资料那份; 人物在小说里写了一篇稿子,交付是那篇稿子 → 戏中戏那份,正文部分仍按正文那份。

几条从实际返工里长出来的具体规矩,举几个例:

  • 正文一次成型,不是修改记录。 作者让你改,你就把改完的结果直接写出来;不许让人物"先做了个错的、后来才做成对的"。判据是:假设读者只读过这一版,这句还成立吗?
  • 不许替人物编号。 「两条。第一条……第二条……」是最刺眼的一种 AI 味。人说话不长编号:他会把最要紧的先说,说着说着发现不够,再补一条,中间还允许对方插一句质疑。编号只允许出现在人物真在念清单的时候。
  • 不许把专业对象简化成玩具。 写一位学者做的、或研究的东西,先查它真正的形状。把一个数学结构做成好画的形状,等于把它删掉了。
  • 素材是既成事实。 小说里人物写的那份稿子,可以读、可以引用,一个字都不许改。引文对不上,只能改正文。

novel_project 工具

扫描与分类不靠临场判断——那是一段固定步骤,写成了纸面上的代码(project-scan.js,499 行)。

node project-scan.js "D:\某个项目路径"

不用开会话就能跑,输出和工具返回的一样:目录本体证据(文件数、总大小、扩展名构成、最新改动)、 下一层每个子文件夹的评分与依据、把握程度(确定/较可能/拿不准/无证据),以及单独一栏的戏中戏。

评分刻意做得简单可审计:每一条线索一个固定权重,判决旁边永远印着原始证据——这样人和模型都可以公开地不同意它。


这个包里有什么

文件大小作用
agent.cordis.yml~40 KB组合。第 1 行是 persona(本模式的全部人格与纪律),最后一行挂 project-scan.js
project-scan.js~22 KBnovel_project 工具
preset.yml~1 KB显示名与描述
skills/novel-prose/6,240 净字小说正文章法
skills/play-within-play/3,513 净字戏中戏
skills/appreciation-craft/2,821 净字赏析随笔
skills/source-research/2,717 净字查资料与档案

不含 DSH 自带的两份技能(cordis-plugin-development、editing-cordis-compositions)——它们随部署的 cordis 预设走。要写插件或改组合,用那个预设另开会话。


两个坑(都是真踩过的,写在这里省你时间)

1. 工具的 parameters 不是 JSON Schema,是"属性表"

这是本 preset 出过一次整轮失败的原因:

Invalid schema for function 'novel_project':
schema must be a JSON Schema of 'type: "object"', got 'type: null'.

工具注册表把 definition.parameters 原样交给模型提供方,它不编译。DSH 里 parameters 的正式形态是 逐属性的 spec,required 写在每个属性里面:

parameters: {
  path: { type: 'string', required: true, description: '…' },
}

官方由 defineTool()(来自 @deepseek-ai/dsh-tools)编译成 { type:'object', properties:{…}, required:[…] }。 本包没有直接 import 它——preset 目录下裸导入解析不到——而是内联了一个只覆盖本工具所需类型的 compileParameters(),遇到别的类型直接抛错而不是瞎猜。

要改工具入参:改那份属性表并补上对应类型,不要图省事直接写完整 JSON Schema。

2. 技能是会话启动时读的

改完技能不会在当前会话生效,要新开一个会话。技能发现按 SKILL.md 的 description 触发, 所以改技能时不要动 description 里的触发词。


适配哪些 DSH 版本

针对 @deepseek-ai/dsh 0.1.5-rc.2 实测。组合里用到了 !!js 表达式与 include 行, preset 机制本身要求该部署启用了 @deepseek-ai/dsh-agent-presets(Web 与 TUI profile 默认启用)。

技能与工具都只依赖部署自带的包,没有额外 npm 依赖。


License

MIT。见 LICENSE。