Files
jocay 283f40892a 优化 API 配置:一个弹窗完成接口、Key 与模型选择
- 去掉预设供应商,直接选择接口类型并填写 Base URL、API Key
- 可在保存前从接口拉取模型,搜索并勾选多个;也可手动输入模型名
- 适配中转站:漏写 /v1(Gemini 为 /v1beta)时自动补全,同时发送 Bearer 与官方鉴权头
- 保存时服务端同步连接下的模型列表;编辑时不填 Key 也可拉取
- 单模型测试与参数设置;手机端布局优化

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 02:23:09 +08:00

98 lines
5.8 KiB
Markdown
Raw Permalink 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 兼容 / 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/<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 服务与端到端测试
```