Novel Agent 技术档案

Technical Dossier

把长篇小说创作变成可维护的本地工程资产。

Novel Agent 不是普通写作聊天框,也不是纯 Dify 应用。它把已有小说导入为每书独立的 Markdown 资料库,用 Dify 承载活跃大纲、续写和审核 Agent,用后端 LangChain 管线承载可重复初始化与结构化批处理, 再用 LoreGit 工具层把 Agent 写入动作约束到本地文件和 Git 历史中。

产品形态 小说创作 IDE

文件、动作、Agent、审阅台和 Git 分支工作台共同服务作者,而不是只提供聊天窗口。

运行权威 每书 Markdown + Git

正式章节、摘要、世界观、状态卡、文风、大纲、草稿和审查档案都落在每本书自己的工作区。

Agent 边界 Dify + LangChain + LoreGit

Dify 负责协作式语义工作流,LangChain 负责可测试批处理,LoreGit 负责确定性读写和版本审计。

Problem

AI 写小说的主要矛盾不是模型不会写,而是长篇创作会失控。

对长篇网文作者来说,真正困难的是让剧情、状态、设定、伏笔、风格和读者承诺在数十万字后仍然可维护。 如果 AI 只输出一次性文本,作者很快会失去追踪、打回、比较和回退的抓手。

  • 已有章节、摘要、世界观、状态卡和文风提示如果只留在聊天上下文里,就无法长期维护。
  • 作者想试两条剧情线时,不应该靠复制文件夹,而应该能开真实剧情分支。
  • 续写草稿需要审核、人工修改、打回重写和归档接棒,而不是直接覆盖正式章节。
  • Agent 生成后的文件变化应该能 diff、能提交、能回退,且不污染源码仓库。
  • 部署到新机器时,Dify、模型密钥、Flask 后端和本地书库必须有清晰边界。

Boundary

它不是什么:先排除几个容易误会的范式。

常见范式 典型关注点 Novel Agent 的差异
AI 写作聊天框 输入 prompt,输出正文 聊天只是入口之一;系统核心是文件资产、审阅台、动作层和剧情 Git 分支。
纯 Dify 应用 可视化 Agent 编排 Dify 不拥有本地文件和 Git 历史,写入必须经 LoreGit 后端;部分初始化管线已迁移到 LangChain。
通用 Agent 框架 任务编排和工具调用 它是面向小说资料库、章节生产、审核归档和剧情分支的垂直工作流。
云端 SaaS 多租户、账单、统一部署 当前目标是本地优先、可复现 demo 和工程展示;受控体验版只是小范围展示入口。

Architecture

总体架构:作者操作工作台,Agent 通过受控工具修改每本书。

Author

作者 导入、讨论、审阅、确认、回退
React Workbench 书架、文件、动作、审阅台、Git UI

Backend

Flask LoreGit API 路径安全、SSE、Git、运行配置、工具桥
LangChain Pipelines 摘要、世界/状态、文风初始化和结构化批处理
LoreGit ToolProvider Dify Agent 读写书库的受控入口

Book Runtime

Markdown Workspace chapters、summary、world、style、outline、draft、error archive
Nested Git Repository 剧情分支、diff、提交、回退和审计
Dify Active Agents 大纲、续写、审核,以及世界/文风协作入口
Review / Delivery Desk 审核、人工编辑、打回重写、确认归档
Novel Agent 工作台截图
真实工作台截图:左侧是文件资产,中间是 Markdown 工作区,右侧是 Agent / Git / 审阅操作面。

1. 文件是长期资产

章节、世界观、状态卡、文风、大纲和错误档案都不是聊天上下文,而是可维护文件。

2. Agent 不能绕过后端

Dify Agent 写入必须经过 LoreGit 工具层,后端负责路径、文件、状态和 Git 边界。

3. 作者拥有最终确认权

续写先进入草稿和审阅台,正式章节归档需要作者确认。

Runtime Authority

三个权威源不能混淆。

书籍内容权威novel_git_server/storage/<book_id>/
正式章节chapters/*.md
当前草稿chapter_draft.md
创作知识summary.mdworld_model.mdstatus_card.md
剧情版本每本书内部的 .git/
运行配置Dify Base URL、Agent API Key、模型 Key,本地忽略
Dify 运行时Dify PostgreSQL、插件、模型供应商和 App API Key
DSL 快照dify_workflows/*.yml,不是完整运行时备份

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

章节生产不是“直接写正文”,而是草稿、审核、重写和归档的交付管线。

  1. 导入与初始化

    小说导入为 chapters/*.md,再由后端批处理生成摘要、世界/状态、文风和大纲底座。

  2. 分层大纲

    brainstorm.mdmaster_outline.mdarc_outline.mdchapter_outline.md 分别承载灵感、长线、篇章和章节卡。

  3. 滚动三章

    控制器读取已接受章节、待审草稿和章节卡,触发现有续写 Agent;控制器本身不写小说正文。

  4. 审核与打回

    审核 Agent 给出剧情、设定、状态和断章风险;打回重写时,续写 Agent 需要读取审核建议、旧草稿和错误档案。

  5. 作者确认归档

    作者可以直接修改草稿;确认后后端拆分章节,写入 chapters/*.md,清理草稿并更新状态桥接。

Agent Ownership

Dify 和 LangChain 不是二选一,而是分层合作。

管线 / Agent 状态 当前职责
读书存档 Agent已退役summary.md 初建和重建已迁移到后端 LangChain 摘要归档管线。
世界模型 Agent保留协作初始化/重建职责已退役;当前负责初始化后的讨论、解释、局部修订和考据。
文风学习 Agent保留协作初始化/重建职责已退役;当前负责文风档案后的解释、建议和作者协作修订。
灵感大纲 Agent活跃大纲讨论、联网参考、四层大纲落档和章节卡补充。
续写 Agent活跃按章节卡、原文、项目档案和错误档案写入 chapter_draft.md
审核 Agent活跃审查剧情、设定、状态、断章和正文归档风险,写入 error_archive.md
后端 LangChain 管线活跃摘要归档、世界/状态初始化、文风初始化、结构化修复和 OpenAI-compatible 调用。

Code Map

核心代码导读:从工作台、后端、管线到部署。

主工作台

frontend/src/App.tsx

文件视图、Agent 面板、审阅台、Git 工作台和动作入口的主装配。

Flask App

novel_git_server/app.py

blueprint 注册、健康检查、运行配置和 public-demo session 入口。

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> 绑定回原会话。