项目案例、设计取舍与后续更新:execute42 / NovelFlow
NovelFlow 是面向本地单用户的 AI 长篇小说创作工作台。它把“生成草稿”和“写入正史”严格分开:AI 可以协助构思、生成和审查,但不能自动改写故事正史、人物状态或后续正文。
- 作者始终拥有最终决定权;AI 输出默认是草稿或候选项。
- 只有作者明确批准,版本、记忆候选和故事事实才会进入正式状态。
- 替换正式稿会标记所有叙事后续场景为“需复查”,系统不会擅自改写它们。
- 写作上下文遵循故事时间与知识边界,避免角色提前获知后续事件。
- 前端用户文案使用中文;后端 API 枚举保持英文,并由前端映射显示。
- 创作向导:从点子、世界观、人物、大纲或直接正文进入访谈式共创。
- 故事圣经:统一维护核心概念、人物、人物关系、世界观、大纲和时间线。
- 大纲生成:根据故事圣经生成卷、章、场景结构,作者确认后再写入。
- 快速创作:输入一个点子,快速建立基础项目结构并进入普通工作台。
- Tiptap 正文编辑器、场景卡编辑、写作辅助和 AI 场景生成。
- 编辑内容自动保存为工作草稿;手动“保存版本”才会创建不可变的场景版本。
- 场景版本以规范化 Tiptap JSON 为权威文档,Markdown、纯文本、schema 版本和内容哈希由统一编解码契约生成;旧客户端只提交 Markdown 时仍会自动转换。
- 桌面端提供可调宽三栏工作台;中小屏幕将大纲和创作辅助切换为抽屉,专注模式只保留正文。
- 正文可在现代无衬线与书籍衬线之间切换,并支持 14/16/18/20px、三档行距和三档版心;偏好只保存在本机,不会写入正文或导出文件。
- 提供撤销、重做、加粗、斜体、二级标题、引用和列表等基础格式工具,现有 Markdown 版本格式保持兼容。
- 右侧中文分组为“创作”“检查”“资料”;版本历史集中展示
vN / 来源 / 梗概 / 字数,版本审批也在资料区完成。
- AI 生成场景后创建草稿版本;正史采用必须由作者手动确认。
- 每次正式批准都会创建不可变的
CanonCommit,记录前序提交、规范化内容哈希、场景契约和审查快照;替换历史形成可追溯的线性提交链。 - 数据库阻止修改已保存版本的正文与生成来源;完整性审计会同时核对实际正文、版本文档哈希、兼容投影和 Canon 提交链。
- 正式稿导出和“上一场景”写作上下文以最新 Canon 提交为准,即使兼容投影发生漂移也不会读取旧稿。
- 场景删除、正式稿替换、记忆应用与场景完成等生命周期判断同样以 Canon 为准;审校、记忆提取和 AI 梗概统一读取无格式纯文本投影。
- 一致性审查发现问题后,可按条处理;阻塞问题允许填写原因后强制批准。
- 记忆提取产生候选项,作者可确认、修改或拒绝;AI 不会自动写入正史。
- 场景上下文可关联角色与世界观条目,并受 POV、故事时间、显式关系和项目规则限制。
- 长正文审查与记忆提取按完整段落分块,记录证据位置并去重。
- 替换既有正式稿会使相关旧记忆失效,生成影响报告并标记后续场景待复查。
- 场景生成使用 SSE 流式输出。
- 生成任务持久化为
WorkflowRun,带数据库活动任务唯一锁和递增事件 ID。 - 页面刷新后可恢复任务状态与已有草稿;取消操作会同步写回后端。
- 后端:Python 3.10+、FastAPI、Pydantic v2、SQLAlchemy 2(异步)、Alembic、SQLite
- 前端:React 18、TypeScript、Vite、Tailwind CSS、Tiptap、TanStack Query
- 模型:DeepSeek、兼容 OpenAI API 的服务、Ollama、FakeLLM
- 质量工具:pytest、Ruff、mypy、Vitest、React Testing Library、ESLint、Prettier
后端:
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e ".[dev]"
alembic upgrade head
python scripts/seed.py
uvicorn app.main:app --reload --port 8000前端:
cd frontend
npm install
npm run dev打开 http://127.0.0.1:5173。前端默认使用 http://127.0.0.1:8000/api,后端同时允许 http://localhost:5173 与 http://127.0.0.1:5173 的本地开发请求。
不要把 API Key 写入项目文件、Markdown、日志或 Git。建议通过 Windows 用户环境变量设置:
[Environment]::SetEnvironmentVariable("DEEPSEEK_API_KEY", "your-key", "User")模型设置页可以保存不同 Provider 的连接配置。当前项目仅面向本地单用户,API Key 会以明文保存在本机 SQLite 数据库中;数据库文件已被 Git 忽略,但这不等同于加密。不要复制数据库到公开位置,也不要将当前存储方式直接用于多人或公网部署。
若密钥曾被提交到 Git,应立即在服务商后台撤销并重新生成;仅删除文件不足以使历史记录失效。
安装后端后,可以在数据库仍被 NovelFlow 使用时创建一致性 SQLite 备份。备份完成前会执行完整性检查,默认不会覆盖已有文件:
cd backend
novelflow-db create --output .\backups\novelflow-2026-07-16.db
novelflow-db verify .\backups\novelflow-2026-07-16.db恢复默认写入新的数据库路径,便于先验证恢复结果再替换现有数据:
novelflow-db restore .\backups\novelflow-2026-07-16.db --output .\restored\novelflow.db也可以使用 python -m app.platform.backup 调用相同命令。数据库迁移、批量导入或大规模正史变更前应先创建备份。
- 新建项目,选择创作入口或使用“快速创作”。
- 通过访谈式共创补充主题、冲突、世界规则和人物动机。
- 编辑并确认候选内容,建立故事圣经与大纲。
- 编写或生成场景草稿,按需保存不可变版本。
- 在“资料 → 版本历史”查看版本,审查后再批准正式稿;阻塞问题如需通过,必须填写原因。
- 提取记忆候选,由作者决定哪些人物状态、知识、世界观或时间线更新成为正史。
- 遇到正式稿替换时,查看影响报告并复查所有被标记的后续场景。
场景的叙事顺序由卷、章、场景的 sequence_no 决定,故事内时间使用 story_time_order。后续场景获得的知识会被标记为不可提前泄露;写作上下文不会将这些信息交给较早的场景。
- 当前稳定版本:v0.4.0(2026-07-18)。
- 发布标签只指向经过完整前端验证的
main;历史开发分支在合入后会清理,日常使用以main和 Release 为准。
后端:
cd backend
ruff check .
ruff format --check .
mypy app
python scripts/verify_migrations.py
pytest tests -v
python scripts/smoke.py前端:
cd frontend
npm run format
npm run lint
npm run test
npm run build
node scripts/smoke.mjs当前主线已验证:从空 SQLite 数据库执行全部 Alembic 迁移、重复运行初始化数据、后端与前端测试、静态检查、构建,以及两端本地 smoke 启动。
GET /api/healthGET /api/model/providersPOST /api/model/testPOST /api/model/generateGET /api/scenes/{scene_id}/contextPOST /api/scenes/{scene_id}/generateGET/PUT /api/scenes/{scene_id}/working-draftGET/PUT /api/scenes/{scene_id}/context-linksPOST /api/scenes/{scene_id}/versionsGET /api/scenes/{scene_id}/canon-commitsGET /api/projects/{project_id}/canon-integrityGET /api/workflows/runs/{run_id}GET /api/projects/{project_id}/impact-reportsPOST /api/scenes/{scene_id}/clear-stalePOST /api/scene-versions/{version_id}/reviewPOST /api/scene-versions/{version_id}/extract-memoriesGET /api/scene-versions/{version_id}/issuesGET /api/scene-versions/{version_id}/candidatesPATCH /api/candidates/{candidate_id}
公开仓库只保留本文件 README.md 作为 Markdown 文档入口。开发计划、交接记录、本机脚本和内部资料放在被忽略的 local-dev-docs/;docs/、local-dev-docs/ 与 CLAUDE.md 都不会随 Git 推送。
构建生成的 *.egg-info/、本地数据库、日志、.env 与依赖目录也已被忽略,不应提交。