dsh-tool-epub:在 DeepSeek Harness 里读、造、拆 EPUB 3

前言

在 DeepSeek Harness(DSH)里做长文或电子书相关任务时,模型往往只能处理「一段 HTML」或「几个章节文件」,而 EPUB 本身是一套带强制约束的容器:ZIP 里 mimetype 必须首位且不压缩,OPF 里 spine 与 nav 还要彼此一致。用通用 ZIP 库随手打包,常见问题不是立刻报错,而是阅读器拒收,或章节边界猜错却仍能打开——排查成本高。

下面介绍社区插件 dsh-tool-epub(维护者 yuehancn,GitHub:yuehancn/dsh-tool-epub)。它在 DSH 进程内提供四个工具,把「先看清结构」和「再动手改/造」分开;ZIP 读写与 XML 解析为自实现,不依赖 epubjs、jszip,externalDependency 为 none。插件在 SkillHub 目录分类为「模型推理」,本质是供智能体调用的 EPUB 工具集,而非单独的推理模型。

这是什么

dsh-tool-epub 是面向 DeepSeek Harness 的自建工具插件:只读体检现有 .epub,从章节或单一大 HTML 组装合规 EPUB 3,或按 spine 顺序拆回逐章文件。README 写明在 dsh 0.2.0-rc.2(preview)上构建测试;apply(ctx) 插件规范稳定,若你使用更新版本 dsh,需自行核对兼容性。package.json 中版本为 1.0.0,许可证 MIT。

为什么 EPUB 需要专门工具

EPUB 不是改后缀的 Word,而是 ZIP + OCF + OPF + XHTML 的组合。容易出错的往往是判断环节:

  • spine(阅读顺序)与 nav(目录)各声明一遍章节,两者不一致时,多数「书坏了」来自此处。
  • 从大 HTML 拆章依赖标题层级推断,猜错时可能静默错位。
  • 多数 ZIP 库默认压缩所有条目;mimetype 被压缩后,严格阅读器会直接拒收。

插件设计把 epub_inspect 独立成只读工具,不强制作为 epub_build 的前置步骤:「这本书现在长什么样」与「我要造一本什么样的书」是两件独立决策。

四个工具

epub_status

长任务前先调用,查看本插件支持读、造、拆,以及 externalDependency: none;同时返回章节数上限与单次调用时间预算,避免做到一半才触顶。

epub_inspect(path)

只读不写,不解包到磁盘即可返回:

返回项 说明
title / creator / language / identifier OPF 元数据
epubVersion 通常 3.0
entryCount ZIP 条目数
chapters[] 按 spine 顺序的逐章记录,含 words、bytes
toc[] nav 目录树
totalWords 全书字数
images[] 引用的图片
warnings[] 结构问题清单

warnings 会明确列出例如:mimetype 被压缩或不在首位;spine 声明的文件不在 ZIP 内;nav href 悬空;spine 文档在目录中不可达;linear="no";缺少 properties="nav" 等。

epub_build(outputName, …)

生成 EPUB 3,两条路径二选一:

方式 参数 用途
显式章节 chapters: [{title, html}, …] 边界已知
自动推断 html: "<一个大 HTML>" + splitLevel 按标题层级切分

outputName 必填(如 my-book.epub)。可选 title、language、author、identifier(未给则按内容生成稳定 URN)、splitLevel(默认 auto 或 h1–h6)、coverImagePath。返回含 splitRule,说明边界如何切出;build 与 inspect 的字数统计口径一致(含注入的 <h1>)。

epub_split(path, …)

将 EPUB 按 spine 顺序拆成逐章文件并写清单。

参数 说明
path 必填,.epub 路径
outputDir 默认走配置
format html(默认)或 txt
prefix 文件名前缀,默认 slug,支持中文
includeToc 是否额外写 index.html 目录页

txt 与字数统计共用同一标签剥离逻辑;章节文件名按 spine 补零三位(-001、-002),字典序与阅读顺序一致。

安装与启用

一行安装(命令来自项目 README):

dsh plugin --profile desktop add github:yuehancn/dsh-tool-epub

支持的 profile:desktop(桌面版)、web(Web 版)。安装后重启 dsh 即可在工具列表中看到上述能力。

配置

在 ~/.dsh/profiles/<profile>/cordis.patch.yml 中可覆盖插件配置,例如:

# ~/.dsh/profiles/<profile>/cordis.patch.yml
- id: tool-epub
  config:
    outputDir: C:/Users/you/Documents/epub-output
    defaultTitle: Untitled
    defaultLanguage: zh-CN
    defaultAuthor: 你的名字
    maxChapters: 500
    timeoutMs: 60000
字段 默认 说明
outputDir epub-output 产物目录
defaultTitle Untitled 无标题时的兜底
defaultLanguage en BCP 47;中文书可设 zh-CN
defaultAuthor "" 写入生成书的作者
maxChapters 500 超限则拒绝构建
timeoutMs 60000 单次调用预算
status / inspect / build / split true 可按需关闭单个工具

典型用法思路

  1. 对已有书:epub_inspect(path="book.epub"),根据 warnings 与 chapters[]、toc[] 决定是否改 spine/nav 或重打包。
  2. 从已知章节列表:epub_build(outputName="my-book.epub", title="…", chapters=[{title, html}, …])。
  3. 从整页 HTML:epub_build(..., html="…", splitLevel="auto"),检查返回的 splitRule 是否符合预期。
  4. 导出编辑:epub_split(path="book.epub", format="html"),在配置的 outputDir 下得到按 spine 命名的章节文件。

长任务前可先 epub_status 确认章节上限与超时预算。

安全与运行环境

README 说明:href 经 resolvePath 归一化,带 zip-slip 防护;outputName 中的 ../ 会被净化;不联网、不执行书内脚本,仅解析文本与 XML;同输入可得到字节一致的 EPUB(固定时间戳与 identifier 策略),便于 diff 对比。

适用与注意:插件在 当前 dsh 进程权限 下读写你指定的路径;安装前建议阅读 源码仓库 与 MIT 许可证。DSH 生态强调「一切皆插件」;SkillHub 插件目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-tool-epub 把 EPUB 的「体检、组装、拆解」收进 DSH 工具面,强调 spine/nav 一致性与可解释的拆章规则,适合需要在智能体工作流里处理 EPUB 3、且希望零额外 npm 电子书依赖的场景。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye