Technical Dossier
把长篇小说创作变成可维护的本地工程资产。
Novel Agent 不是普通写作聊天框,也不是纯 Dify 应用。它把已有小说导入为每书独立的 Markdown 资料库,用 Dify 承载活跃大纲、续写和审核 Agent,用后端 LangChain 管线承载可重复初始化与结构化批处理, 再用 LoreGit 工具层把 Agent 写入动作约束到本地文件和 Git 历史中。
文件、动作、Agent、审阅台和 Git 分支工作台共同服务作者,而不是只提供聊天窗口。
正式章节、摘要、世界观、状态卡、文风、大纲、草稿和审查档案都落在每本书自己的工作区。
Dify 负责协作式语义工作流,LangChain 负责可测试批处理,LoreGit 负责确定性读写和版本审计。
Problem
AI 写小说的主要矛盾不是模型不会写,而是长篇创作会失控。
对长篇网文作者来说,真正困难的是让剧情、状态、设定、伏笔、风格和读者承诺在数十万字后仍然可维护。 如果 AI 只输出一次性文本,作者很快会失去追踪、打回、比较和回退的抓手。
- 已有章节、摘要、世界观、状态卡和文风提示如果只留在聊天上下文里,就无法长期维护。
- 作者想试两条剧情线时,不应该靠复制文件夹,而应该能开真实剧情分支。
- 续写草稿需要审核、人工修改、打回重写和归档接棒,而不是直接覆盖正式章节。
- Agent 生成后的文件变化应该能 diff、能提交、能回退,且不污染源码仓库。
- 部署到新机器时,Dify、模型密钥、Flask 后端和本地书库必须有清晰边界。
Boundary
它不是什么:先排除几个容易误会的范式。
Architecture
总体架构:作者操作工作台,Agent 通过受控工具修改每本书。
Author
Backend
Book Runtime
1. 文件是长期资产
章节、世界观、状态卡、文风、大纲和错误档案都不是聊天上下文,而是可维护文件。
2. Agent 不能绕过后端
Dify Agent 写入必须经过 LoreGit 工具层,后端负责路径、文件、状态和 Git 边界。
3. 作者拥有最终确认权
续写先进入草稿和审阅台,正式章节归档需要作者确认。
Data Objects
每本书都是一个可维护的 Markdown 工程。
novel_git_server/storage/<book_id>/
├── .git/
├── chapters/
├── summary.md
├── world_model.md
├── status_card.md
├── domain_rules.md
├── style_fingerprint.md
├── style_review.md
├── style_constraints_for_continuation.md
├── brainstorm.md
├── master_outline.md
├── arc_outline.md
├── chapter_outline.md
├── chapter_draft.md
├── error_archive.md
└── import_report.json
summary.md是正式章节派生的阅读档案,由后端摘要归档管线生成和重建。world_model.md是长期世界规则,status_card.md是当前章节后的状态投影。- 四个大纲文件分层承担灵感池、长线承诺、篇章留存和可执行章节卡。
chapter_draft.md是续写草稿和审阅面,只有作者确认后才归档进chapters/*.md。error_archive.md用来沉淀审核问题,让续写系统能读到历史打回经验。
Production Pipeline
章节生产不是“直接写正文”,而是草稿、审核、重写和归档的交付管线。
-
导入与初始化
小说导入为
chapters/*.md,再由后端批处理生成摘要、世界/状态、文风和大纲底座。 -
分层大纲
brainstorm.md、master_outline.md、arc_outline.md和chapter_outline.md分别承载灵感、长线、篇章和章节卡。 -
滚动三章
控制器读取已接受章节、待审草稿和章节卡,触发现有续写 Agent;控制器本身不写小说正文。
-
审核与打回
审核 Agent 给出剧情、设定、状态和断章风险;打回重写时,续写 Agent 需要读取审核建议、旧草稿和错误档案。
-
作者确认归档
作者可以直接修改草稿;确认后后端拆分章节,写入
chapters/*.md,清理草稿并更新状态桥接。
Agent Ownership
Dify 和 LangChain 不是二选一,而是分层合作。
summary.md 初建和重建已迁移到后端 LangChain 摘要归档管线。chapter_draft.md。error_archive.md。Code Map
核心代码导读:从工作台、后端、管线到部署。
主工作台
frontend/src/App.tsx文件视图、Agent 面板、审阅台、Git 工作台和动作入口的主装配。
书架与导入
frontend/src/bookshelf/BookshelfApp.tsx书架、导入、配置入口和书籍管理。
Flask App
novel_git_server/app.pyblueprint 注册、健康检查、运行配置和 public-demo session 入口。
Dify 流式桥
novel_git_server/agents/world_draft.pyDify Agent 流式桥接、文件路由、会话持久化和草稿写入。
LoreGit 工具
novel_git_server/agents/tools.py暴露给 Dify 的受控文件和书库工具接口。
Git 控制台
novel_git_server/agents/git_console.py每书 Git 状态、分支、历史、diff、提交和回退。
摘要归档
novel_git_server/pipelines/summary_archive.py摘要归档批处理、结构化提取和确定性 Markdown 渲染。
部署体检
deploy/demo/deploy_doctor.py本地和受控体验版两套部署画像的健康检查。
Call Chains
关键调用链:从作者动作到本地书库。
导入新书
BookshelfApp
-> frontend/src/api/tomatoImport.ts
-> /books/tomato/*
-> novel_git_server/agents/tomato_import.py
-> chapters/*.md + import_report.json
-> summary / world / style initialization
-> nested Git commit
续写草稿
Workbench action / ChatPanel
-> /api/world/deduce_stream
-> Dify continuation Agent
-> LoreGit ToolProvider
-> chapter_draft.md
-> prose delivery state
正文化归档
Prose delivery acceptance
-> read .loregit/prose_delivery_state.json
-> split accepted chapter_draft.md
-> chapters/*.md
-> reset chapter_draft.md
-> status / summary bridge
-> nested Git commit
剧情分支查看和切换
GitBranchPanel
-> /books/git_history_list?ref=...
-> timeline view without checkout
explicit checkout
-> /books/git_checkout
-> dirty / draft guard
-> actual branch switch
Evaluation
评估不靠“感觉能写”,而靠可验证链路。
导入完整性
能否把长篇小说稳定落为章节文件、导入报告和每书 Git 仓库。
管线归属
初始化、摘要、世界/状态、文风、大纲、续写、审核是否由正确层负责。
正文交付
草稿、审核、人工编辑、打回重写、归档和草稿清理是否形成闭环。
部署安全
Release 包、GHCR、受控体验版和 Dify Runtime 是否明确排除密钥和私有书库。
python -m pytest novel_git_server/tests/test_v78_prose_delivery_api.py novel_git_server/tests/test_v79_public_demo_mode.py -q
python deploy/demo/deploy_doctor.py --profile local --env deploy/demo/.env
python deploy/demo/deploy_doctor.py --profile public-demo --frontend-url http://127.0.0.1:15173
git diff --check
Run
部署分本地 demo 和受控体验版,两者验收口径不同。
本地启动
.\start_demo.ps1 -InitEnv
# 编辑 deploy/demo/.env
.\start_demo.ps1
本地体检
python deploy/demo/deploy_doctor.py --profile local --env deploy/demo/.env --backend-url http://127.0.0.1:8000 --frontend-url http://127.0.0.1:5173
受控体验版体检
python deploy/demo/deploy_doctor.py --profile public-demo --env /etc/novel-agent-demo.env --backend-url http://127.0.0.1:18000 --frontend-url http://127.0.0.1:15173
本地画像不检查会话隔离;云端受控体验版必须检查 cookie 沙箱、配置中心只读、Dify 无 cookie
工具回调绑定和 book_id 优先级。完整步骤见 部署说明。
Release Boundary
公开仓库应该包含什么,不应该包含什么。
应该包含
- 前端、后端、后端 LangChain 管线和 LoreGit 工具代码。
- 净化后的 Dify DSL YAML 快照。
- Release ZIP、GHCR 镜像配置、部署体检和 smoke check。
- 公开文档、真实截图和演示说明。
不应该包含
- 模型 API Key、Dify App API Key、SSH 密码或 cookie。
- 私有 Dify PostgreSQL 备份。
- 真实用户书库、
novel_git_server/storage/和.runtime/。 - 本地视频制作工程、私有聊天和运行时草稿。
FAQ
常见疑问。
为什么不用纯 Dify?
Dify 适合可视化 Agent 编排,但本地书库、每书 Git、diff 审阅、正文归档、导入质量门槛、配置中心和分支回退更适合由 Flask/LoreGit 后端掌控。
为什么还要 LangChain?
摘要归档、世界/状态初始化、文风初始化等任务需要批处理、结构化校验、确定性渲染和 OpenAI-compatible 配置,放在后端更可测。
哪些 Dify 管线已经退役?
读书存档 Agent 已从主动链路退役;世界模型和文风学习 Agent 没有整体退役,但初始化/重建职责已经迁移到后端管线。
Agent 能不能直接改正式正文?
不能直接改正式章节。续写 Agent 写 chapter_draft.md,正式章节归档需要作者确认,由后端写入 chapters/*.md。
Dify DSL 是不是完整备份?
不是。DSL 是工作流结构和提示词快照,可以作为导入模板;完整运行还需要 Dify Runtime、模型供应商、插件、ToolProvider 地址和 App API Key。
为什么云端体验版要会话隔离?
为了防止访问者互相污染书库。浏览器请求用 cookie 隔离,Dify 工具回调没有 cookie,所以还需要通过合法 demo_<session>_<book> 绑定回原会话。
Further Reading