Skip to content

ADR-0024: 文件类型与 Tier 归一化语义

历史决策记录:保留当时的背景、状态和设计。当前接口与实现归属以 开发入口 和现行规范为准;文中的历史模块路径不保证仍存在。

状态: Accepted,已实现 日期: 2026-07-09 Tasks 语义更新: 2026-10-27 相关文档: ../tiers.md, ../cli/mineru-parse.md, ../cli/mineru-kit-parse.md, ../api/tasks.md, 0022-doclib-file-type-tier-remote-semantics.md, 0028-csv-structured-flash-parsing.md

背景

MinerU doclib 可以接收 PDF、image、Office、text 和 HTML 输入,但这些输入并不具备相同的解析能力。

PDF 和 image 支持质量 tier: flash、basic、standard、advanced。EPUB、Office、HTML 和 CSV 当前只有 flash 语义,没有对应的质量 tier。其它 text 可入库和搜索,但不需要解析。此前不同入口对“非 PDF/image + 质量 tier”的处理不完全一致:

  • 有的入口报错。
  • 有的入口静默走 Office / HTML / CSV parser,或为其它 text 返回没有对应缓存的合成成功响应。
  • parsing-rule 可能创建 tier=standard 等 parse row,但实际执行的仍是 Office / flash 语义。

这种不一致会让 parse row、缓存目录、locator 和用户看到的实际解析能力脱节。因此需要定义一套按操作类型区分的归一化规则。

本 ADR 细化并部分修订 ADR-0022。ADR-0022 中 doclib 主动单文件解析的严格错误语义仍保留;本 ADR 补充 batch、parsing-rule、API Server 和 mineru-kit 的例外。ADR-0028 进一步把 CSV 从无需解析 text 移入仅支持 flash tier 的结构化输入组。

决策

1. 文件类型分组

MinerU 在 tier 语义上把输入分为三组:

分组 文件类型 Tier 能力
支持多 tier 的输入 PDF、image flash、basic、standard、advanced
仅支持 flash tier 的输入 Office、HTML、CSV 仅 flash 语义
无需解析的文本输入 .txt、.md、.markdown、.rst、.tex 无 tier;直接读取源文件

EPUB、Office、HTML 和 CSV 即使通过高层接口传入了 basic、standard 或 advanced,也不能把结果记录为这些质量 tier,除非未来另有 ADR 明确引入对应能力。text 不创建 parse row 或 Middle JSON,显式 parse 返回 parse_not_required。

2. 单对象主动操作

单对象主动操作包括:

  • mineru parse <single-file> 经 doclib 解析。
  • DoclibClient.ensure_parse(ParseRequest(...))。
  • 本地 SDK 直接解析单个文件(HTTP MinerUApiParser 遵循下述 Tasks 规则)。
  • mineru-kit parse 展开后只有一个输入文件。

规则:

输入类型 未指定 tier 指定 flash 指定 basic/standard/advanced
PDF / image 使用该入口默认质量选择策略 使用 flash 使用指定质量 tier
Office / HTML / CSV 归一为 flash 使用 flash 报错
text 不解析;doclib 返回 parse_not_required 不解析;doclib 返回 parse_not_required 不解析;doclib 返回 parse_not_required

因此,单对象主动操作中,用户显式指定质量 tier 表达明确质量预期。对于没有质量 tier 能力的输入,系统不能静默降级。SDK 和 mineru-kit 的解析输入校验直接排除 text;doclib 使用更具体的 parse_not_required 指导用户读取源文件。

3. 批量操作

批量操作包括:

  • API Server / Router 的 V1 Tasks,包括单文件请求及 HTTP SDK、file_parse 的提交。
  • mineru-kit parse 展开后包含多个输入文件,或输入目录。
  • parsing-rule 触发的后台解析。

批量操作的目标是处理一组异构文件。为了避免一个 Office 或 HTML 文件阻断整个批次,仅支持 flash tier 的输入允许静默归一为 flash。text 文件不进入 parse 批次;需要保留内容时直接读取或建立文本索引。

规则:

输入类型 未指定 tier 指定 flash 指定 basic/standard/advanced
PDF / image 使用该入口默认选择策略 使用 flash 使用指定质量 tier
Office / HTML / CSV 归一为 flash 使用 flash 归一为 flash
text 不进入 parse 批次 不进入 parse 批次 不进入 parse 批次

批量操作中,EPUB/Office/HTML/CSV 的实际 parse row、缓存目录、locator 和 metadata 必须记录 flash,不能记录用户传入的质量 tier。其它 text 不得生成这些解析产物。

Tasks 的顶层请求 tier 可选,只对 PDF/image 生效。省略或 JSON null 时,接单服务按 standard -> basic -> flash 选择支持的档位;advanced 必须显式指定,仅有 advanced 时省略 tier 返回 503 quality_tier_unavailable。 显式档位不受支持且批次包含 PDF/image 时,整个创建请求返回 400 invalid_request,不自动升降档。纯原生文档忽略合法的显式 tier,固定使用 flash;非法枚举或空字符串仍报参数错误,原生解析是所有正常可用服务的必备能力,不依赖 /v1/tiers 是否发布 flash。 选档在接单时保存,后续逐文件执行和 Router 转发使用有效档位,不随 worker 默认值变化。成功结果通过 files[].parse.tier 返回真实执行档位,不在顶层回显请求 tier,也不产生伪质量缓存。其它 text 不进入 Tasks 解析。 Tasks 默认选择独立于 Doclib 主动操作的默认质量策略,不改变后者必须显式选择 flash 的规则。

4. Parsing-Rule 语义

parsing-rule 是批量/后台规则,不是用户对单个文件的显式 parse 请求。

规则:

  • tier 和 remote 参数只适用于 PDF 和 image。
  • EPUB、Office、HTML 和 CSV 命中 parsing-rule 时,忽略 rule 中的 tier、page_range 和 remote,按 flash 整本解析。
  • text 命中 parsing-rule 时只完成入库和文本索引,不创建 parse row。
  • PDF/image 命中 parsing-rule 且指定 tier 时,使用 rule tier。
  • PDF/image 命中 parsing-rule 但未指定 tier 时,按以下顺序选择可用 tier:
standard -> basic -> flash

这与用户主动阅读默认选择不同。parsing-rule 是后台批量策略,可以接受最后降级到 flash,因为 watch 自动发现本身也接受 flash。

5. Remote 语义

remote 的含义取决于入口:

入口 EPUB/Office/HTML/CSV + remote text + remote
doclib / mineru parse 单文件主动解析 报 remote_unsupported_for_file_type 报 parse_not_required
parsing-rule 忽略 remote,按 flash 只入库和索引
API Server / Router Tasks 不适用;HTTP 请求明确发往配置的解析服务 不接受 text 作为解析输入
mineru-kit parse 允许,作为低层工具特例 不接受 text 作为解析输入

doclib 单文件主动解析中,remote=true 表示用户显式要求把该文件交给 remote parse-server。因为 remote parse-server 只支持 PDF/image,该组合必须报错,不能静默改成本地 flash,否则会改变用户显式选择的执行路径和隐私语义。

mineru-kit parse 是低层工具,允许 --remote 处理 EPUB/Office/HTML/CSV;当这些输入不能使用质量 tier 时,按批量归一规则处理。其它 text 不作为解析输入。

替代方案

方案 A: EPUB/Office/HTML/CSV 一律静默忽略 tier

未采用。

原因:

  • 单文件主动操作中,用户显式指定质量 tier 通常表示明确质量预期。
  • 静默忽略会让脚本和用户误以为质量 tier 已执行。
  • doclib 的 parse row、缓存和 locator 应准确表达实际结果能力。

方案 B: EPUB/Office/HTML/CSV 一律遇到质量 tier 报错

未采用。

原因:

  • 批量任务经常包含混合文件类型。
  • parsing-rule 是后台批量策略,不应因为 EPUB/Office/HTML/CSV 携带无效质量 tier 而阻断整个目录处理。
  • API Server V1 Tasks 是多文件接口,也应支持异构输入。

方案 C: 为 API Server 增加 file-level effective tier 字段

原先暂缓的响应设计已由 Tasks 的 files[].parse.tier 实现。该字段来自成功产物的实际元数据,不以请求档位代替;不再使用 job-level tier 表示整批实际执行档位。

影响

对 doclib

  • doclib 单文件主动解析保持严格语义: EPUB/Office/HTML/CSV 显式质量 tier 报错;其它 text 返回 parse_not_required。
  • EPUB/Office/HTML/CSV 未指定 tier 或指定 flash 时,实际记录为 flash。
  • parsing-rule 触发 EPUB/Office/HTML/CSV 时,实际 parse row 必须为 flash;其它 text 只入库和索引。
  • parsing-rule 对 PDF/image 未指定 tier 时,允许 standard -> basic -> flash 兜底。

对 SDK 和 mineru-kit

  • 本地 SDK 单文件解析按单对象主动操作语义处理,并排除 text 解析输入;HTTP MinerUApiParser 遵循 Tasks 语义。
  • mineru-kit parse 需要根据展开后的输入数量区分单对象和批量。
  • mineru-kit parse --remote 对 EPUB/Office/HTML/CSV 是允许的低层工具特例;其它 text 不作为解析输入。

对 API Server

  • API Server 和 Router Tasks 按批量操作语义处理,包括单文件提交。
  • EPUB/Office/HTML/CSV 即使请求 tier 是质量 tier,执行时也按 flash 语义;其它 text 不进入 Tasks 解析。
  • 成功文件的实际档位通过 files[].parse.tier 返回,默认选档及错误规则见上文。

对缓存和 locator

  • 缓存键、parse row、locator 和产物 metadata 必须记录实际 tier。
  • EPUB/Office/HTML/CSV 不应产生 basic、standard 或 advanced 缓存;其它 text 不应产生任何解析缓存。

后续动作

  1. 更新 doclib parsing-rule 入队逻辑,确保 EPUB/Office/HTML/CSV 创建 tier=flash 的 parse row,其它 text 不创建 parse row。
  2. 更新 parsing-rule 的 PDF/image 默认 tier 选择顺序为 standard -> basic -> flash。
  3. 检查 SDK、mineru-kit 和 API Server,对单对象和批量操作分别应用本 ADR 的归一化规则。
  4. 同步更新 CLI、SDK 和 API 文档,避免继续表述为“所有入口统一报错”或“所有入口统一静默降级”。

2026-09-24 格式扩展:MHTML/MHT 网页归档沿用 HTML 的 Flash-only tier 归一规则,两个后缀均归一为 mhtml,只支持整本解析。