Skip to content
dsh.fish
Agent preset

LLM-for-novel-with-history-and-superheroines

LLM-for-novel-with-history-and-superheroines

Source
bigscientist
License
MIT
Updated
Updated 29 days ago

Readme

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

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

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

生成示例见[https://huggingface.co/datasets/MARK18964758/LLM_for_novel_with_history_and_superheroines](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)

```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 目录**。

### 手动

把下面这些放进 `<你的 DSH_HOME>/.agent-presets/novel/`:

```
<DSH_HOME>/.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 行)。

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

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

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

---

## 这个包里有什么

| 文件 | 大小 | 作用 |
|---|---|---|
| `agent.cordis.yml` | ~40 KB | 组合。第 1 行是 persona(本模式的全部人格与纪律),最后一行挂 `project-scan.js` |
| `project-scan.js` | ~22 KB | `novel_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` 写在**每个属性里面**:

```js
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](LICENSE)。

Install

# Copy the composition to $DSH_HOME/.agent-presets/llm-for-novel-with-history-and-superheroines/agent.cordis.yml

Profile: web

Source