3c9b65d982
- Nuxt 4 + Nuxt UI 4 + AI SDK 7 + Drizzle/SQLite - 主编规划大纲与章节简报、选派作家;作家流式写入章节文件并实时推送前端 - 逐章确认模式(默认)与自动模式;摘要与故事记忆 - 酒馆角色卡(PNG/JSON,V1-V3)与世界书导入 - 自定义最高优先级系统提示词、审稿/修改/多版本、任务日志与提示词检视 - 模拟 LLM 服务与端到端测试脚本 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
5.6 KiB
Markdown
98 lines
5.6 KiB
Markdown
# AI 小说工坊
|
||
|
||
用「主编 + 作家」多模型协作来写长篇小说的本地 Web 应用。
|
||
|
||
- **主编**(例如 Claude):规划章节大纲,为每一章撰写「章节简报」(情节要点、出场人物、基调、文风、结尾钩子……),选派作家,审稿。主编只读每章的摘要,不读全文,长篇写作也不会撑爆上下文。
|
||
- **作家**(例如 Gemini,可以有多位):按简报写正文,正文流式**直接写入 `data/` 下的章节文件**,同时实时推送到前端显示。
|
||
- **摘要员**:章节确认后提炼摘要,并更新人物状态、伏笔、时间线等「故事记忆」,保证后续章节连贯。
|
||
|
||
主编、作家、摘要员都可以单独设置**最高优先级的自定义系统提示词**。
|
||
|
||
## 功能
|
||
|
||
| 模块 | 说明 |
|
||
|---|---|
|
||
| 模型与 API | OpenAI 兼容(OpenAI / DeepSeek / OpenRouter / 硅基流动 / Ollama…)、Anthropic、Google Gemini;拉取模型列表、连接测试;API Key 用 AES-256-GCM 加密存储 |
|
||
| 故事设定 | 故事背景/世界观、故事大纲、写作要求(语言、文风、视角、叙述方式、字数、其他要求)、写作流程开关 |
|
||
| 角色与世界书 | 手动管理角色;**导入酒馆角色卡**(PNG 的 `ccv3`/`chara` 文本块,或 JSON;兼容 V1/V2/V3),自动替换 `{{char}}`/`{{user}}`,内置世界书(character_book)转为项目世界书;世界书支持常驻条目和关键词/正则触发 |
|
||
| AI 团队 | 主编、摘要员、任意多位作家;每位成员可以选模型、设置自定义系统提示词;主编也可以用已配置的模型自行创建作家(可关闭) |
|
||
| 写作台 | 章节列表;简报查看/编辑;作家指派(手动指派会锁定,主编不会更换);实时写作显示;手动编辑正文;多版本切换;主编审稿;按意见修改或重写 |
|
||
| 写作流程 | **逐章模式(默认)**:每章写完就暂停,用户确认后再写下一章;**自动模式**:自动确认并连续写作,到达章节上限后暂停;可选「简报后暂停」;随时停止 |
|
||
| 故事记忆 | 人物当前状态、伏笔(未回收/已回收)、时间线,可以手动修正 |
|
||
| 任务日志 | 每次 AI 调用的状态、耗时、token 用量,以及**完整提示词检视** |
|
||
| 导出 | TXT / Markdown,可选择全部章节或仅已确认章节 |
|
||
|
||
## 快速开始
|
||
|
||
需要 Node.js 22+ 和 pnpm。
|
||
|
||
```bash
|
||
pnpm install
|
||
pnpm dev # http://localhost:3000
|
||
```
|
||
|
||
1. 打开「模型与 API」,添加提供方(可以用快速填写),再在提供方下添加模型并点击「测试」。
|
||
2. 新建作品,填写「故事设定」,在「角色与世界书」中新建角色或导入酒馆角色卡(**请使用原始 PNG 文件**:截图或经聊天软件压缩后,图片里的角色数据会丢失)。
|
||
3. 在「AI 团队」中给主编、摘要员、作家分配模型(例如主编用 Claude,作家用 Gemini),按需填写自定义系统提示词。
|
||
4. 回到「写作台」,点击右上角「继续下一章」。主编会先规划章节,再为第 1 章写简报并交给作家;写完后暂停,阅读后点击「确认并继续下一章」。
|
||
|
||
## 部署(单用户自托管)
|
||
|
||
```bash
|
||
pnpm build
|
||
NOVEL_DATA_DIR=/var/lib/novel HOST=127.0.0.1 PORT=3000 pnpm start
|
||
```
|
||
|
||
| 环境变量 | 说明 |
|
||
|---|---|
|
||
| `NOVEL_DATA_DIR` | 数据目录,默认 `./data`:包含 `app.db`、`secret.key`、`projects/<id>/chapters/*.md`、头像 |
|
||
| `NOVEL_SECRET_KEY` | 可选,64 位十六进制的 API Key 加密密钥;不设置时自动生成 `data/secret.key`(**请备份**,丢失后需要重新填写 API Key) |
|
||
| `NOVEL_PASSWORD` | 可选,设置后启用 HTTP Basic 访问密码(用户名任意)。**部署到公网或局域网时务必设置** |
|
||
| `HOST` / `PORT` | 监听地址和端口 |
|
||
|
||
应用需要在项目根目录启动(运行时会读取 `server/db/migrations` 执行数据库迁移)。
|
||
|
||
## 章节文件
|
||
|
||
每一个版本都是一个独立的 Markdown 文件,例如:
|
||
|
||
```
|
||
data/projects/<项目id>/chapters/0003-v2.md # 第 3 章第 2 版
|
||
```
|
||
|
||
作家输出时边生成边写入;中途停止或出错时,已写出的部分会保留在文件中,章节回退到之前的有效版本。
|
||
|
||
## 提示词分层
|
||
|
||
```
|
||
System:
|
||
<highest_priority_instructions> 用户自定义系统提示词 </highest_priority_instructions> ← 最高优先级
|
||
角色内置提示词(主编 / 作家 / 摘要员)
|
||
写作要求
|
||
Prompt:
|
||
世界观 → 相关角色 → 触发的世界书 → 故事大纲 → 章节规划 → 前情摘要 → 故事记忆
|
||
→ 上一章结尾原文 → 章节简报 →(修改意见 / 上一版草稿)→ 任务
|
||
```
|
||
|
||
每次调用实际发送的完整提示词都可以在「任务日志」中查看。
|
||
|
||
## 开发
|
||
|
||
```bash
|
||
pnpm typecheck # 类型检查(app + server)
|
||
pnpm db:generate # 修改 server/db/schema.ts 后生成迁移
|
||
pnpm mock:llm # 启动模拟的 OpenAI 兼容接口(不消耗 token)
|
||
pnpm test:e2e ./角色卡.png # 端到端测试(需先启动 pnpm dev 和 pnpm mock:llm;角色卡参数可选)
|
||
```
|
||
|
||
技术栈:Nuxt 4(Vue 3 + Vite)、Nuxt UI 4、Vercel AI SDK 7、Drizzle ORM + better-sqlite3、Zod 4。
|
||
|
||
```
|
||
app/ 前端(页面、组件、组合式函数)
|
||
server/api/ REST 接口
|
||
server/utils/ 核心逻辑:pipeline(主编/作家/摘要流程)、prompts(提示词)、card(角色卡解析)、llm(模型接入)
|
||
server/db/ 数据库表结构与迁移
|
||
shared/types/ 前后端共享类型
|
||
scripts/ 模拟 LLM 服务与端到端测试
|
||
```
|