Files
ai-novel-studio/README.md
T
jocay 3c9b65d982 AI 小说工坊:主编 + 作家多模型协作写作应用
- 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>
2026-10-18 02:04:40 +08:00

98 lines
5.6 KiB
Markdown
Raw 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.
# 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 服务与端到端测试
```