dsh-doc-router:先识别文档再选提取管线

前言

在 DeepSeek Harness(DSH)里让模型读 PDF、Office 或 Markdown 时,常见做法是直接丢给某一种转换器。多栏论文在这套流程里很容易「看起来成功、实则读序错乱」:正文被拆成大量表格行,或左右栏逐行交错。DSH 社区插件 dsh-doc-router(维护者 Dantwz7,分类:工作流)把问题拆成两步:先用确定性探测判断文件真实格式与 PDF 版式,再推荐并调用对应的提取管线。

这是什么

dsh-doc-router 是注册在 DSH 上的文档路由插件。它提供 doc_route、pdf_markdown 两个工具,并在 runtime 技能层注册 doc-routing 技能,使「先路由再阅读」的规则在各工作区生效,而不必在每个仓库里单独放 skills/ 目录。

路由结论不调用模型、不联网、不消耗 token,属于确定性判定。

为什么要路由

README 用 Nature Letter 样例(nmat4749.pdf)和仓库内合成 PDF 对比过几种管线:布局感知的 pymupdf4llm 能按阅读顺序合并多栏;pypdf 文本可读但结构丢失;MarkItDown 会把正文碎成大量 | … | 表格行。在 two-column-reading-order.pdf、three-column.pdf 上,MarkItDown 会按页垂直扫过所有栏(左右/左中右交替),而 pdf_markdown 输出则是先左栏再右栏(或三栏依次)。插件的论点是:没有单一转换器通吃所有 PDF,需要先探测再选管线。

核心功能

能力 说明
doc_route 识别格式、页数、是否有文本层、单栏/多栏估计,并给出推荐管线及逐页探测证据
pdf_markdown 基于 PyMuPDF 的布局感知 PDF → Markdown;支持页码范围与写入磁盘
doc-routing skill 引导模型在读取前先调用路由,避免误用 MarkItDown 处理多栏正文

仓库 fixtures 上 doc_route 的示例结论包括:two-column.pdf、three-column.pdf 等多栏带文本层 PDF 推荐 pdf_markdown;无文本层或扫描类场景会指向其他策略(如渲染为图像再核对)。简介中概括的其余类型由 MarkItDown 等管线处理,具体以每次 doc_route 返回的 recommend 为准。

安装与启用

环境要求

项 要求
DSH >=0.2.0-rc.1 <0.3.0-0 \|\| >=0.2.1-rc.1 <0.3.0-0
Node ^22.19.0 \|\| >=24.0.0
Python 3.9+(仅 PDF 版式探测与 pdf_markdown 需要)
PyMuPDF 可选;未安装时插件仍可加载,doc_route 仍可按格式分类,版式探测与 pdf_markdown 会明确提示不可用

Python 解释器查找顺序(先命中先用):config.pythonPath → 环境变量 DOC_ROUTER_PYTHON → DSH 自带 runtime → ~/.dsh/dsh-runtimes → PATH 上的 python。

安装插件

推荐通过 DSH 包管理器安装,并固定版本(避免最小发布龄策略解析到更旧构建)。安装后需重启 DSH。

plugin_manager action=install_bundle target="dsh-doc-router@0.6.1"

若使用 CLI,需把 <YOUR-PROFILE> 换成 DSH 实际启动所用的 profile;错误的 profile 名不会报错,而是新建空 profile 并把包装在那里,运行中的实例拿不到插件。

dsh plugin --profile <YOUR-PROFILE> add dsh-doc-router@0.6.1

不确定当前 profile 时,优先使用上面的 plugin_manager 命令。

启用 PDF 版式与转换

在插件解析到的 Python 上安装 PyMuPDF 相关包:

<the python the plugin resolved> -m pip install -U pymupdf pymupdf4llm

许可证为 MIT;PyMuPDF 为可选依赖,使用前请自行阅读插件仓库中的 license 说明。

典型用法

下面步骤与 README Quick start 一致,路径为仓库内可复现的 fixture(相对工作区路径)。

1. 先路由

调用 doc_route,查看格式、栏数估计与推荐管线:

doc_route({ path: "tests/fixtures/two-column.pdf" })

→ Routed tests/fixtures/two-column.pdf — format: pdf, pages: 1, text layer: yes, columns: multi-column (est 2)
  Recommended pipeline: pdf_markdown
  …
  dsh-doc-router v0.6.1

默认提示语为英文;自 0.4.0 起可通过配置把说明改为中文(见下节)。

2. 再转换

多栏 PDF 按推荐调用 pdf_markdown:

pdf_markdown({ path: "tests/fixtures/two-column.pdf" })

→ Converted tests/fixtures/two-column.pdf (all 1 pages) — 3391 characters of Markdown. …

需要完整正文落盘时指定 output;内联输出超过 maxChars 时会截断并明确说明。

pdf_markdown({ path: "tests/fixtures/two-column.pdf", pages: "1", output: "paper.md" })

→ Converted tests/fixtures/two-column.pdf (pages 1) — wrote 3391 characters to paper.md.

两个工具均接受相对工作区的路径。

配置要点

除 pythonPath 外,README 配置节提到 noteLanguage: 'zh' 可将路由后的说明行改为中文;判定字段(如 recommend、probe)与语言无关。

适用场景与注意

适合需要在 DSH 工作流中稳定读取 PDF、Word、Excel 等文档、且希望模型不要「凭感觉选转换器」的开发者。多栏论文、期刊 PDF 应优先走 doc_route → pdf_markdown;公式、上下标或数字必须完全一致时,README 建议对相关页渲染为图像再核对。

安装前请注意:插件与 DSH 同一进程权限运行,安装前应阅读 GitHub 仓库 源码与 MIT 许可证;PyMuPDF 为可选组件,合规与部署环境需自行评估。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,仅为社区收录入口。

结尾

dsh-doc-router 的价值在于「Route before you read」:用确定性探测替代单一转换器,减少多栏 PDF 被静默打乱读序的风险。进一步了解实现与 fixtures 证据,见 GitHub:Dantwz7/dsh-doc-router 与 SkillHub 目录页。

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

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

小夜