# AI 小说工坊 用「主编 + 作家」多模型协作来写长篇小说的本地 Web 应用。 - **主编**(例如 Claude):规划章节大纲,为每一章撰写「章节简报」(情节要点、出场人物、基调、文风、结尾钩子……),选派作家,审稿。主编只读每章的摘要,不读全文,长篇写作也不会撑爆上下文。 - **作家**(例如 Gemini,可以有多位):按简报写正文,正文流式**直接写入 `data/` 下的章节文件**,同时实时推送到前端显示。 - **摘要员**:章节确认后提炼摘要,并更新人物状态、伏笔、时间线等「故事记忆」,保证后续章节连贯。 主编、作家、摘要员都可以单独设置**最高优先级的自定义系统提示词**。 ## 功能 | 模块 | 说明 | |---|---| | 模型与 API | 一个弹窗完成配置:接口类型(OpenAI 兼容 / Anthropic 原生 / Gemini 原生)、Base URL、API Key,模型可从接口拉取后勾选或手动填写;适配中转站(漏写 `/v1` 自动补全);单模型测试与参数;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」→「添加 API」,选择接口类型,填写 Base URL(中转站一般带 `/v1`)和 API Key,点「从接口拉取模型」勾选需要的模型(也可以手动输入模型名),保存后点「测试」。 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//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: 用户自定义系统提示词 ← 最高优先级 角色内置提示词(主编 / 作家 / 摘要员) 写作要求 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 服务与端到端测试 ```