← dsh-novel-writer 技术文档

技术文档

dsh-novel-writer 的 18 个工具全部在本地运行,不使用在线大模型:所有指标由规则统计与本地 ONNX 推理得出。本组页面面向二次开发与集成方,逐工具说明参数契约、计算原理、约束边界与源码位置。

阅读约定

每个工具页固定按以下顺序组织,可以跳读:

  • 参数:名称、类型、是否必填、语义与校验方式;
  • 输出结构:返回体字段与渲染层行为;
  • 计算原理:公式、词表、阈值与取舍,尽量给出可直接对照源码的表达式;
  • 约束与边界:对调用方模型的限制、被静默跳过的情形,以及跨版本不可比之处;
  • 源码位置:lib/*.js 中的对应实现。
关于数值。从 v4.3.0 起,本插件做了一轮口径整修(统一句末符、清洗动作词表、抽象度改最长匹配、修饰密度增加停用词、六维基线 μ=0 改绝对尺度判定等)。同一本书在新旧版本下的报告数值不可直接比较,涉及具体差异的页面会单独标注。
v5.0.0 新增两个工具。novel_chapter_brief(开写包)把动笔前要读的材料装配成一次只读调用;novel_fix_plan(改稿台)把风格自检的测量数据翻译成按优先级排序的待办清单。工具数 16 → 18,另为 novel_plot 增加 action: "graph" 结构视图(不新增工具,跨章计算并入既有伏笔工具)。两个新工具均不生成正文,也不调用在线模型。
v5.0.0 另有系统提示词的「档位 × 场景」两个正交维度。档位(systemPromptMode:off / brief / full)决定注入多少,场景(promptScene:general / writing / revising / auditing / setup)决定注入什么;场景仅在 full 档下生效,且只改提示词内容、不改任何工具能力。老状态文件没有 promptScene 键时落到 general(即 4.x 的通用工作流,本版仅在其中补入 7 行新工具入口指引),既有工作流不变。两字段的读写入口与完整语义见 novel_sentence_config。

工具总览

章节与文稿

分析与测量

设定、剧情与创作资料

审计与配置

该调哪个工具

工具数到 18 之后,「选对工具」本身也有了成本。下表按你想回答的问题给出口径;其中三个分析类工具名字最像,一并说明区别。

你想回答的问题用哪个主要输出
这本书整体是怎么写的(写作手法)novel_sentence_analysis九类句式分布与排列规律、句式模板、段落结构、句长节奏、情感曲线、风格指纹与节奏建议
我这一章写得像不像原著novel_style_check单章 vs 全书其余章的指纹相似度与 high / medium / low 分级、偏差清单、六维出带判定、原著锚段
这本书是什么风格novel_style_report六维测量与 μ±σ 基线、词汇、题材与流派、情感、氛围 12 轴、语义距离、锚包与 AI 风格判断
动笔前我该读哪些材料novel_chapter_brief承接口、上一章钩子、大纲方向行、命中人物卡、未回收伏笔及埋设距离、世界观禁用词、六维基线、锚段与骨架、禁用清单与三段式 plan
这一章要改哪里、改完没有novel_fix_plan按 severity → effort 排序的待办清单(带段落行号与改写方向,不给改写后的正文)+ verify 三态复测
全书有没有断线 / 丢人 / 忘伏笔novel_plot(action: "graph")伏笔生命周期与埋设距离、人物出场矩阵与连续缺席(≥ 5 章)、线索活跃度与最大空档、时间线顺序核对、大纲方向行对照
三个分析工具已共享底层引擎与缓存,重叠在实现层、不在接口层。novel_sentence_analysis / novel_style_check / novel_style_report 用的是同一套句式与情感引擎,读写的也是同一批缓存文件(<book>-chapters-metrics.json 分章六维测量、<book>-full.json 全书分析、analysis/<book>-<sha1>.json 句式报告历史、style-reports/<book>.json 风格判断)——分章测量的指纹按文件名排序后再哈希,因此三者交替调用命中同一份缓存,不会互相击穿。它们不合并,是因为回答的问题互不替代(怎么写 / 像不像 / 是什么风格),输出形状也各不相同;合并会把三份 output.schema 并成一份、并让三个稳定的工具名消失(MCP 客户端配置、文档页与提示词一起失效),代价大于收益。这里用「意图 → 工具」的对照表做消歧,而不是减少工具数。

共同约定

书库根目录与路径

所有工具接受可选的 root(含 novels 子目录的目录)。解析优先级:调用参数 root → 插件配置项 → MCP 启动参数 --root → 环境变量 DSH_NOVEL_WRITER_ROOT → 当前工作目录。MCP 形态下,参数里的 root 必须落在启动时 --root 指定范围内;越界时由 MCP 层静默回退到 --root,只写入 stderr 日志,调用方不会收到错误(插件层 resolveRoot 本身不做范围校验,范围校验只在 MCP 层 isInsideRoot 进行)。书名、分类等片段经 sanitizeSegment 过滤,防止路径穿越。

数据落盘

所有派生数据集中写在 <书库根>/.novel-writer/ 下:plots(伏笔)、settings(设定)、summaries(摘要)、analysis(分析报告)、audits(审计)、embedding(语义索引)、style-reports(风格画像)。写盘采用临时文件 + 原子替换;失败会抛出 ENOVELWRITEFAIL 而不是静默丢弃。

语义引擎的可用性

语义检索、语义风格距离与语义隐性情感依赖随包分发的 bge-small-zh-v1.5 量化模型(约 24MB)与 onnxruntime-web(WASM)。引擎不可用时这些能力自动降级为纯规则模式,其余功能不受影响;返回体会以 skippedDims 或专用文案说明降级原因,而非返回空结果。

MCP 形态的边界

包内 mcp/server.mjs 把同样 18 个工具暴露为 stdio MCP 服务器(可用 Streamable HTTP 传输)。协议侧:未知工具返回 -32602(Protocol Error);支持 2025-11-25 / 2025-06-18 / 2025-03-26 / 2024-11-05 版本协商并原样回显;JSON-RPC 批量请求自 2025-06-18 起按规范拒绝;单行报文上限 4 MiB;novel_import 的 src 默认限制在书库根内,需显式加 --allow-external-src 才能放开。