ADR-0001: JSON 输出格式命名
历史决策记录:保留当时的背景、状态和设计。当前接口与实现归属以 开发入口 和现行规范为准;文中的历史模块路径不保证仍存在。
状态: Accepted 日期: 2026-06-09 相关文档: ../cli/mineru-parse.md, ../api/tasks.md, ../sdk/parse-result.md, ../middle-json.md
背景
MinerU 当前同时存在三类 JSON 结构:
- Middle JSON: 保真的中间结构,按 page / block / line / span 组织。
- Content List v1: 旧的扁平内容列表。
- Content List v2: 新的按页组织、语义更强的结构化内容列表。
如果 CLI、API 或 SDK 只暴露 json 这个格式名,调用方无法知道返回的是哪一种 JSON。随着 Agent、SDK 和第三方客户端开始依赖这些输出,json 会成为不稳定的契约名称。
同时,content-list-v2 也不适合作为长期公开名称。v2 是历史演进状态,不应出现在面向用户的长期格式名中;版本应由 schema version 表达。
决策
公开输出格式使用语义名称,不使用 json 表示具体产物。
正式格式名:
| 语义 | CLI 格式名 | API / SDK 格式名 | 说明 |
|---|---|---|---|
| Markdown | markdown |
markdown |
默认阅读输出。 |
| 纯文本 | text |
text |
可选阅读输出。 |
| Middle JSON | middle-json |
middle_json |
完整中间结构,用于缓存、调试、高级 SDK 和重新 render。 |
| Content List v1 | content-list |
content_list |
扁平内容列表。 |
| Structured Content | structured-content |
structured_content |
面向 Agent 和新客户端的结构化内容 JSON,替代公开名称 content-list-v2。 |
| HTML | html |
html |
从 Middle JSON 或 Markdown 派生的 HTML 输出。 |
Structured Content 是面向新客户端的 Content List v2 类结构产品名。低层 mineru.render 同时正式保留 content_list 与 content_list_v2 两套 3.4.5 兼容输出;它们属于 SDK render 合同,但不因此进入 NEXT CLI 或 API Server 的正式格式集合。
json 不作为正式格式名。CLI/API 产品文档继续使用 structured-content / structured_content,不把 content-list-v2 / content_list_v2 作为同义格式名;需要精确兼容 3.4.5 V2 结构的 SDK 调用方使用 mineru.render.RenderFormat.CONTENT_LIST_V2 或 render_content_list_v2()。
输出边界
Middle JSON
Middle JSON 是 doclib 唯一持久化的解析内容产物。它应保留足够信息,以支持:
- read-time render Markdown。
- read-time render Content List v1。
- read-time render Structured Content。
- 按页增量解析和批次合并。
- 后续 schema migration。
Middle JSON 适合核心开发者、SDK 高级用户和需要重新渲染的系统使用,不作为 Agent 默认结构化消费格式。
Content List v1
Content List v1 是扁平数组,适合简单消费,但不承载新的 Agent-native 语义承诺。
Structured Content
Structured Content 是面向 Agent、新客户端和结构化下游的推荐 JSON。它应强调:
- 按页组织。
- 标题、段落、列表、公式、图片、表格、代码等语义类型。
- 可选 bbox / locator。
- 稳定 schema version。
Structured Content 的版本演进通过 schema version 表达,而不是把公开格式名改成 structured-content-v2、structured-content-v3。
替代方案
方案 A: 保留 json
不采用。json 是编码方式,不是产物语义。继续用它会让 Middle JSON、Content List v1 和 Structured Content 三者在 CLI/API/SDK 中混淆。
方案 B: 继续公开 content-list-v2
不采用。v2 暴露了历史实现细节,不适合长期公开契约。一旦出现下一版结构,用户会被迫理解 v2/v3 的命名迁移,而不是理解稳定语义。
方案 C: 命名为 agent-json
不采用。Structured Content 适合 Agent,但不只服务 Agent。把格式绑定到 Agent 会限制 SDK、Web UI 和第三方系统的使用场景。
方案 D: 命名为 semantic-content
不采用。它强调语义,但比 structured-content 更抽象。structured-content 更容易让开发者理解这是可机器消费的结构化文档内容。
影响
- CLI
--format应支持middle-json、content-list、structured-content。 - API
output_formats应支持middle_json、content_list、structured_content。 render_content_list()/render_content_list_v2()作为低层 SDK 兼容输出保留;新客户端优先使用 Structured Content。- doclib 的
parsed/目录仍只持久化 Middle JSON;Content List v1 和 Structured Content 都是读取时派生结果。
后续动作
- 更新 CLI/API/SDK 文档中的格式名示例。
- 为 Structured Content 定义 schema version 字段和 validator。
- 文档必须区分低层兼容 renderer 与 CLI/API 产品格式名,不能把
content_list_v2当作structured_content的别名。 - Content List renderer 只从严格 MiddleJson 派生,不恢复 backend-specific converter。