parse-bench 1.0.6__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. {parse_bench-1.0.6 → parse_bench-2.0.0}/.gitignore +2 -1
  2. {parse_bench-1.0.6 → parse_bench-2.0.0}/CHANGELOG.md +103 -20
  3. {parse_bench-1.0.6 → parse_bench-2.0.0}/PKG-INFO +61 -14
  4. {parse_bench-1.0.6 → parse_bench-2.0.0}/README.md +58 -13
  5. {parse_bench-1.0.6 → parse_bench-2.0.0}/pyproject.toml +2 -0
  6. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/__init__.py +1 -1
  7. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/data/cli.py +15 -1
  8. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/data/download.py +39 -3
  9. parse_bench-2.0.0/src/parse_bench/evaluation/_registration.py +37 -0
  10. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/cli.py +162 -5
  11. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/layoutdet.py +18 -4
  12. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/parse.py +10 -1
  13. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_adapters/adapters.py +90 -4
  14. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_adapters/registry.py +11 -13
  15. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_label_mappers/mappers.py +12 -4
  16. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_label_mappers/registry.py +12 -13
  17. parse_bench-2.0.0/src/parse_bench/evaluation/markdown_attribution.py +2395 -0
  18. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/chart_next.py +4021 -0
  19. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/__init__.py +45 -0
  20. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/bench_metric.py +314 -0
  21. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_grammar.py +396 -0
  22. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_markdown_adapter.py +547 -0
  23. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_normalization.py +57 -0
  24. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_records.py +88 -0
  25. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_render.py +246 -0
  26. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/form_kv_scoring/kv_submetrics.py +390 -0
  27. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formatting_v2.py +1788 -0
  28. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/__init__.py +5 -0
  29. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/bbox_geometry.py +45 -0
  30. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/field_flatten.py +169 -0
  31. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/field_matching.py +246 -0
  32. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/form_skeleton_teds.py +183 -0
  33. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/form_submetrics.py +552 -0
  34. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/formnode_compat.py +35 -0
  35. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/formnode_scoring/text_normalization.py +64 -0
  36. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/forms_v2.py +4462 -0
  37. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/layout_grounding.py +355 -0
  38. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/layout_grounding_score.py +543 -0
  39. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/next_metrics.py +312 -0
  40. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_base.py +24 -8
  41. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_formatting.py +41 -11
  42. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_table.py +1 -2
  43. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/table_next.py +2921 -0
  44. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_record_match_metric.py +48 -76
  45. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_splitting.py +65 -41
  46. parse_bench-2.0.0/src/parse_bench/evaluation/metrics/parse/text_next.py +2012 -0
  47. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/utils.py +12 -12
  48. parse_bench-2.0.0/src/parse_bench/evaluation/next_score.py +232 -0
  49. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/runner.py +123 -57
  50. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/extensions.py +12 -4
  51. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/pipelines/parse.py +31 -0
  52. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/__init__.py +6 -7
  53. parse_bench-2.0.0/src/parse_bench/inference/providers/extract/__init__.py +29 -0
  54. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/extract/citations.py +3 -1
  55. parse_bench-2.0.0/src/parse_bench/inference/providers/layoutdet/__init__.py +33 -0
  56. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/__init__.py +12 -5
  57. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/_layout_utils.py +64 -19
  58. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/gemma4.py +25 -16
  59. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/infinity_parser2.py +12 -4
  60. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/reducto.py +24 -1
  61. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/registry.py +26 -2
  62. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/pipeline/cli.py +130 -3
  63. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/extract_output.py +2 -2
  64. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/loader.py +9 -1
  65. parse_bench-2.0.0/src/parse_bench/test_cases/markdown_attribution_schema.py +160 -0
  66. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/parse_rule_schemas.py +17 -4
  67. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/schema.py +18 -0
  68. parse_bench-2.0.0/tests/parse_bench/evaluation/evaluators/test_layoutdet_cross_eval_adapter.py +105 -0
  69. parse_bench-2.0.0/tests/parse_bench/evaluation/fixtures/md_attribution_golden/digests.json +242 -0
  70. parse_bench-2.0.0/tests/parse_bench/evaluation/fixtures/md_attribution_golden/outputs.json.gz +0 -0
  71. parse_bench-2.0.0/tests/parse_bench/evaluation/fixtures/md_attribution_golden/rules.json.gz +0 -0
  72. parse_bench-2.0.0/tests/parse_bench/evaluation/fixtures/md_attribution_regressions.json +289 -0
  73. parse_bench-2.0.0/tests/parse_bench/evaluation/layout_adapters/test_fractional_layout_pages.py +154 -0
  74. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/f1040.p1.page.md +110 -0
  75. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/f1040.p2.page.md +175 -0
  76. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/f1040.tree.json +1298 -0
  77. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/k1.p1.page.md +215 -0
  78. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/k1.tree.json +971 -0
  79. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/w2.p1.page.md +128 -0
  80. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/form_kv/w2.tree.json +368 -0
  81. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/fixtures/layout_grounding_presets.json +1 -0
  82. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/layout_grounding_rule_builders.py +65 -0
  83. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/next_wiring.py +18 -0
  84. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_attributed_inline_tags.py +95 -0
  85. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next.py +1578 -0
  86. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next_category_column.py +106 -0
  87. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next_contentious.py +204 -0
  88. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next_dict_json.py +61 -0
  89. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next_robustness.py +123 -0
  90. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_chart_next_series_by_value.py +63 -0
  91. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_form_kv_bench_metric.py +158 -0
  92. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_form_kv_grammar.py +534 -0
  93. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_form_kv_markdown_adapter.py +287 -0
  94. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_form_kv_submetrics.py +246 -0
  95. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_formatting_v2.py +607 -0
  96. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_formatting_v2_heading_pins.py +29 -0
  97. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2.py +988 -0
  98. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_blank_coverage.py +43 -0
  99. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_box_codes.py +106 -0
  100. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_box_inside_label.py +22 -0
  101. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_caption_pairing.py +276 -0
  102. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_caption_value_rows.py +118 -0
  103. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_caption_variants.py +126 -0
  104. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_claimed_line_above.py +43 -0
  105. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_column_alignment.py +138 -0
  106. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_crit_artifacts.py +243 -0
  107. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_footnote_marks.py +61 -0
  108. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_form_copies.py +42 -0
  109. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_header_captions.py +80 -0
  110. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_instruction_prose.py +83 -0
  111. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_letter_spaced_caption.py +122 -0
  112. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_person_columns.py +173 -0
  113. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_printed_blank.py +149 -0
  114. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_printed_century.py +82 -0
  115. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_printed_numbers.py +86 -0
  116. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_printed_table_text.py +84 -0
  117. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_prose_caption_cell.py +49 -0
  118. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_repeated_label_runs.py +79 -0
  119. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_review_fixes.py +117 -0
  120. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_side_by_side_blocks.py +168 -0
  121. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_single_charge.py +78 -0
  122. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_sole_section_field.py +72 -0
  123. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_split_dates.py +117 -0
  124. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_stacked_cells.py +114 -0
  125. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_subfields.py +75 -0
  126. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_table_mapping.py +42 -0
  127. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_value_after_instructions.py +74 -0
  128. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_value_before_caption.py +163 -0
  129. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_forms_v2_value_split_by_caption.py +31 -0
  130. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_layout_grounding.py +372 -0
  131. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_layout_grounding_rules.py +379 -0
  132. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_layout_grounding_wiring.py +164 -0
  133. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_layout_picture_boxes.py +139 -0
  134. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_mark_color_rule.py +87 -0
  135. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next.py +605 -0
  136. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_column_index_row.py +35 -0
  137. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_contentious.py +211 -0
  138. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_dash_tables.py +76 -0
  139. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_fractional_symbol.py +15 -0
  140. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_header_bands.py +80 -0
  141. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_key_whitespace.py +51 -0
  142. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_label_columns.py +88 -0
  143. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_merged_subrows.py +47 -0
  144. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_misattributed_labels.py +101 -0
  145. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_normalization_fixes.py +232 -0
  146. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_normalization_readings.py +76 -0
  147. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_robustness.py +147 -0
  148. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_section_rows.py +41 -0
  149. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_segmentation.py +62 -0
  150. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_serial_column.py +56 -0
  151. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_structural_repeats.py +83 -0
  152. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_sup_whitespace.py +33 -0
  153. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_table_next_wrapped_groups.py +47 -0
  154. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_splitting.py +158 -0
  155. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_tables_values_rule.py +44 -0
  156. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next.py +823 -0
  157. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_adjacent_sup.py +32 -0
  158. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_contentious.py +139 -0
  159. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_glued_decorated_numbers.py +33 -0
  160. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_line_numbers.py +53 -0
  161. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_markdown_urls.py +105 -0
  162. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_markup_glue.py +251 -0
  163. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_paren_negatives.py +111 -0
  164. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_provider_wrappers.py +29 -0
  165. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_robustness.py +246 -0
  166. parse_bench-2.0.0/tests/parse_bench/evaluation/metrics/parse/test_text_next_url_underscores.py +28 -0
  167. parse_bench-2.0.0/tests/parse_bench/evaluation/test_markdown_attribution_golden.py +72 -0
  168. parse_bench-2.0.0/tests/parse_bench/evaluation/test_markdown_attribution_v1.py +1164 -0
  169. parse_bench-2.0.0/tests/parse_bench/evaluation/test_markdown_attribution_v2.py +983 -0
  170. parse_bench-2.0.0/tests/parse_bench/evaluation/test_next_score.py +196 -0
  171. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/test_runner_aggregation.py +18 -0
  172. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_infinity_parser2.py +16 -0
  173. parse_bench-2.0.0/tests/parse_bench/inference/providers/parse/test_layout_blocks_tolerant.py +52 -0
  174. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_reducto_normalize.py +18 -0
  175. parse_bench-2.0.0/tests/parse_bench/test_extensions.py +369 -0
  176. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_extract_integration.py +35 -0
  177. parse_bench-2.0.0/tests/test_leaderboard_scripts.py +192 -0
  178. parse_bench-2.0.0/tests/test_parsebench_2_dataset.py +112 -0
  179. parse_bench-1.0.6/src/parse_bench/inference/providers/extract/__init__.py +0 -22
  180. parse_bench-1.0.6/src/parse_bench/inference/providers/layoutdet/__init__.py +0 -25
  181. parse_bench-1.0.6/tests/parse_bench/test_extensions.py +0 -149
  182. {parse_bench-1.0.6 → parse_bench-2.0.0}/LICENSE +0 -0
  183. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/__init__.py +0 -0
  184. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/aggregation_report.py +0 -0
  185. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/cli.py +0 -0
  186. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/comparison.py +0 -0
  187. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/comparison_core.py +0 -0
  188. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/comparison_report.py +0 -0
  189. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/detailed_report.py +0 -0
  190. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/leaderboard_report.py +0 -0
  191. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/analysis/metric_definitions.py +0 -0
  192. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/cli.py +0 -0
  193. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/data/__init__.py +0 -0
  194. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/data/repetition.py +0 -0
  195. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/__init__.py +0 -0
  196. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/__init__.py +0 -0
  197. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/base.py +0 -0
  198. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/extract.py +0 -0
  199. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/evaluators/qa.py +0 -0
  200. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_adapters/__init__.py +0 -0
  201. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_adapters/base.py +0 -0
  202. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_label_mappers/__init__.py +0 -0
  203. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_label_mappers/base.py +0 -0
  204. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/layout_label_mappers/projection.py +0 -0
  205. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metric_aggregation.py +0 -0
  206. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/__init__.py +0 -0
  207. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/__init__.py +0 -0
  208. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/constants.py +0 -0
  209. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/core.py +0 -0
  210. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/evaluate.py +0 -0
  211. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/geometry.py +0 -0
  212. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/attribution/text_utils.py +0 -0
  213. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/base.py +0 -0
  214. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/downstream/__init__.py +0 -0
  215. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/__init__.py +0 -0
  216. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/json_subset_match.py +0 -0
  217. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/json_subset_match_metric.py +0 -0
  218. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/list_unwrap.py +0 -0
  219. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/rule_based_metric.py +0 -0
  220. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/test_rules.py +0 -0
  221. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/extract/test_types.py +0 -0
  222. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/__init__.py +0 -0
  223. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/core.py +0 -0
  224. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/extract_adapter.py +0 -0
  225. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/parse_adapter.py +0 -0
  226. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/rule_filters.py +0 -0
  227. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/field_grounding/value_compare.py +0 -0
  228. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/layoutdet/__init__.py +0 -0
  229. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/layoutdet/classification_utils.py +0 -0
  230. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/layoutdet/furniture.py +0 -0
  231. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/layoutdet/iou.py +0 -0
  232. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/layoutdet/overlap.py +0 -0
  233. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/__init__.py +0 -0
  234. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/_vendor_grits_reference.py +0 -0
  235. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/chart_json_to_html.py +0 -0
  236. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/cross_page_table_consistency.py +0 -0
  237. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/emphasis_spans.py +0 -0
  238. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/fast_tree_edit.py +0 -0
  239. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/grits_metric.py +0 -0
  240. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/grits_reference_metric.py +0 -0
  241. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/header_accuracy_metric.py +0 -0
  242. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/llm_normalization/__init__.py +0 -0
  243. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/llm_normalization/base.py +0 -0
  244. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/llm_normalization/config.py +0 -0
  245. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/llm_normalization/postprocess.py +0 -0
  246. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/llm_normalization/strategy_judge.py +0 -0
  247. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/mermaid_graph.py +0 -0
  248. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rule_based_judge_metric.py +0 -0
  249. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rule_based_metric.py +0 -0
  250. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_bag.py +0 -0
  251. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_chart.py +0 -0
  252. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_diagram.py +0 -0
  253. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_form.py +0 -0
  254. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_heading.py +0 -0
  255. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_list.py +0 -0
  256. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_page_decoration.py +0 -0
  257. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_repetition.py +0 -0
  258. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_text.py +0 -0
  259. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/rules_watermark.py +0 -0
  260. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/structural_consistency_metric.py +0 -0
  261. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_extraction.py +0 -0
  262. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_merging.py +0 -0
  263. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_pairing.py +0 -0
  264. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_parsing.py +0 -0
  265. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/table_title_stripping.py +0 -0
  266. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/teds_metric.py +0 -0
  267. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/test_rules.py +0 -0
  268. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/test_types.py +0 -0
  269. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/text_content_projection.py +0 -0
  270. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/text_similarity_metric.py +0 -0
  271. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/parse/text_v21.py +0 -0
  272. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/qa/__init__.py +0 -0
  273. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/metrics/qa/answer_comparison.py +0 -0
  274. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/qa/__init__.py +0 -0
  275. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/qa/llm_service.py +0 -0
  276. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/reports/__init__.py +0 -0
  277. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/reports/csv.py +0 -0
  278. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/reports/html.py +0 -0
  279. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/reports/markdown.py +0 -0
  280. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/reports/rule_csv.py +0 -0
  281. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/evaluation/stats.py +0 -0
  282. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/geometry/__init__.py +0 -0
  283. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/geometry/rotated_bbox.py +0 -0
  284. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/__init__.py +0 -0
  285. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/chunkr_layout_extraction.py +0 -0
  286. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/cli.py +0 -0
  287. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/layout_extraction.py +0 -0
  288. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/pipelines/__init__.py +0 -0
  289. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/pipelines/extract.py +0 -0
  290. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/pipelines/layout.py +0 -0
  291. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/pipelines.py +0 -0
  292. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/base.py +0 -0
  293. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/cancellation.py +0 -0
  294. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/extract/extend.py +0 -0
  295. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/extract/llamaextract_v2_api.py +0 -0
  296. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/adapters.py +0 -0
  297. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/base.py +0 -0
  298. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/chandra.py +0 -0
  299. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/docling.py +0 -0
  300. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/dots_ocr.py +0 -0
  301. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/layout_v3.py +0 -0
  302. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/layout_v3_byoc.py +0 -0
  303. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/paddle.py +0 -0
  304. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/qwen3vl.py +0 -0
  305. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/surya.py +0 -0
  306. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/layoutdet/yolo.py +0 -0
  307. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/_docling_common.py +0 -0
  308. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/_unlimitedocr2_convert.py +0 -0
  309. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/aeddix_alpine_ocr_kdl.py +0 -0
  310. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/amazon_nova.py +0 -0
  311. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/anthropic.py +0 -0
  312. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/anyformat.py +0 -0
  313. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/azure_document_intelligence.py +0 -0
  314. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/chandra2.py +0 -0
  315. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/chunkr.py +0 -0
  316. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/cohere_parse.py +0 -0
  317. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +0 -0
  318. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/datalab.py +0 -0
  319. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/deepseek.py +0 -0
  320. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/deepseekocr2.py +0 -0
  321. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/docai.py +0 -0
  322. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/docling.py +0 -0
  323. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/docling_serve.py +0 -0
  324. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/dots_ocr.py +0 -0
  325. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/extend_parse.py +0 -0
  326. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/falconocr.py +0 -0
  327. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/florin_parser_nano.py +0 -0
  328. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/glm_zai.py +0 -0
  329. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/google.py +0 -0
  330. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/google_agentic_vision.py +0 -0
  331. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/google_docai.py +0 -0
  332. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/google_docai_layout_normalization.py +0 -0
  333. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/granite_vision.py +0 -0
  334. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/hpd_parsing.py +0 -0
  335. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/hunyuanocr.py +0 -0
  336. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/jinaocr.py +0 -0
  337. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/kdl_frontier_nano.py +0 -0
  338. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/landingai.py +0 -0
  339. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/lightonocr-3.py +0 -0
  340. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/liteparse.py +0 -0
  341. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/llamaparse.py +0 -0
  342. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/llamaparse_v2_normalization.py +0 -0
  343. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/markitdown.py +0 -0
  344. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/mineru25.py +0 -0
  345. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/mineru2605pro.py +0 -0
  346. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/mineru_diffusion.py +0 -0
  347. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/minicpm_ocr.py +0 -0
  348. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/mistral_ocr.py +0 -0
  349. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/nemotron_omni.py +0 -0
  350. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/nemotron_parse_3_5.py +0 -0
  351. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/nutrient_dws.py +0 -0
  352. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/oi_parser.py +0 -0
  353. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/openai.py +0 -0
  354. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/opendataloader.py +0 -0
  355. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/ovisocr2.py +0 -0
  356. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/ovisocr3.py +0 -0
  357. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/paddleocr.py +0 -0
  358. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/pdf_inspector.py +0 -0
  359. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/pulse.py +0 -0
  360. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/pymupdf.py +0 -0
  361. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/pymupdf4llm.py +0 -0
  362. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/pypdf.py +0 -0
  363. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/qwen.py +0 -0
  364. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/rakedoc_nano.py +0 -0
  365. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/surya2.py +0 -0
  366. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/teleocr.py +0 -0
  367. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/tesseract.py +0 -0
  368. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/textract.py +0 -0
  369. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/unlimitedocr.py +0 -0
  370. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/unlimitedocr2.py +0 -0
  371. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/unstructured.py +0 -0
  372. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/upstage.py +0 -0
  373. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/upstage_normalization.py +0 -0
  374. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/warp_ingest.py +0 -0
  375. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/providers/parse/wevisdoc.py +0 -0
  376. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/renormalize.py +0 -0
  377. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/inference/runner.py +0 -0
  378. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/layout_label_mapping.py +0 -0
  379. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/layout_projection.py +0 -0
  380. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/pipeline/__init__.py +0 -0
  381. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/py.typed +0 -0
  382. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/__init__.py +0 -0
  383. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/evaluation.py +0 -0
  384. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/layout_detection_output.py +0 -0
  385. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/layout_ontology.py +0 -0
  386. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/metrics.py +0 -0
  387. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/parse_output.py +0 -0
  388. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/pipeline.py +0 -0
  389. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/pipeline_io.py +0 -0
  390. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/schemas/product.py +0 -0
  391. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/__init__.py +0 -0
  392. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/bbox_value_strict_comparator.py +0 -0
  393. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/extract_field_paths.py +0 -0
  394. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/layout_attribution_generation.py +0 -0
  395. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/rule_filters.py +0 -0
  396. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/test_cases/rule_ids.py +0 -0
  397. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/utils/__init__.py +0 -0
  398. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/utils/gemini_layout_utils.py +0 -0
  399. {parse_bench-1.0.6 → parse_bench-2.0.0}/src/parse_bench/utils/text_aggregation.py +0 -0
  400. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/analysis/test_comparison_consistency.py +0 -0
  401. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/analysis/test_comparison_core.py +0 -0
  402. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/analysis/test_comparison_directory_suffix.py +0 -0
  403. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/analysis/test_detailed_report.py +0 -0
  404. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/evaluators/test_extract_empty_expected_output.py +0 -0
  405. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/evaluators/test_layoutdet_missing_ro_index.py +0 -0
  406. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_layout_rule_filter.py +0 -0
  407. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_styling_rollup.py +0 -0
  408. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_table_pages.py +0 -0
  409. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_anyformat_prediction_granularity.py +0 -0
  410. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_docling_parse_layout_adapter.py +0 -0
  411. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_attribution_scope.py +0 -0
  412. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_canonical_layout_pages.py +0 -0
  413. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_registry.py +0 -0
  414. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_retained_typed_writers.py +0 -0
  415. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_adapters/test_rotated_attribution_adapters.py +0 -0
  416. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_label_mappers/test_llamaparse_label_mapper.py +0 -0
  417. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_attributes.py +0 -0
  418. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_dual_read.py +0 -0
  419. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/layout_label_mappers/test_pymupdf4llm_label_mapper.py +0 -0
  420. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/attribution/test_attribution_overclaim.py +0 -0
  421. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/attribution/test_rotated_attribution.py +0 -0
  422. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/extract/test_json_subset_match.py +0 -0
  423. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/field_grounding/test_extract_adapter.py +0 -0
  424. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/layoutdet/test_average_precision.py +0 -0
  425. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/layoutdet/test_classification_utils_paging.py +0 -0
  426. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/layoutdet/test_rotated_iou.py +0 -0
  427. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_chart_data_point_rule.py +0 -0
  428. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_chart_json_to_html.py +0 -0
  429. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_chart_label_punctuation.py +0 -0
  430. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_cross_page_table_consistency_metric.py +0 -0
  431. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_degenerate_marker_rules.py +0 -0
  432. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_diagram_rules.py +0 -0
  433. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_fast_table_parity.py +0 -0
  434. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_form_field_rule.py +0 -0
  435. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_formatting_rule_adjacent_spans.py +0 -0
  436. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_grits_metric.py +0 -0
  437. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_grits_perf_equivalence.py +0 -0
  438. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_grits_trm_composite.py +0 -0
  439. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_header_accuracy_metric.py +0 -0
  440. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_heading_structure_rule.py +0 -0
  441. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_latex_arrow_length.py +0 -0
  442. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_latex_script_order.py +0 -0
  443. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_merge_preceding_titles.py +0 -0
  444. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_normalize_cell_text.py +0 -0
  445. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_normalize_text_inline_tag_separator.py +0 -0
  446. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_page_decoration_rule.py +0 -0
  447. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_combining_mark_tokenization.py +0 -0
  448. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_paragraph_spans.py +0 -0
  449. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_quotes.py +0 -0
  450. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_span_scope.py +0 -0
  451. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_list_level_rule.py +0 -0
  452. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_table_cell_augmentation.py +0 -0
  453. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_order_rule_html.py +0 -0
  454. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_presence_rule.py +0 -0
  455. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_relaxed_normalize_cell_text.py +0 -0
  456. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_repetition_overshoot_rule.py +0 -0
  457. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_rule_alarm_thread_context.py +0 -0
  458. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_budget_and_bag_images.py +0 -0
  459. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_side_inputs.py +0 -0
  460. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_caption_title_band.py +0 -0
  461. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_cell_inline_marker_separator.py +0 -0
  462. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_dot_leaders.py +0 -0
  463. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_extraction.py +0 -0
  464. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_marker_cells_rule.py +0 -0
  465. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_merging_metric.py +0 -0
  466. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_pairing.py +0 -0
  467. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_record_match_metric.py +0 -0
  468. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_row_header_th.py +0 -0
  469. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_tbody_provenance.py +0 -0
  470. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_table_title_stripping.py +0 -0
  471. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_teds_metric.py +0 -0
  472. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_text_color_rule.py +0 -0
  473. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_text_content_projection.py +0 -0
  474. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_text_similarity_metric.py +0 -0
  475. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_title_hierarchy_inapplicable.py +0 -0
  476. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/parse/test_watermark_removal_rule.py +0 -0
  477. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/metrics/qa/test_answer_comparison_exact_choice.py +0 -0
  478. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/test_cli_detailed_report_nonfatal.py +0 -0
  479. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/test_runner_result_files.py +0 -0
  480. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/test_runner_worker_timeout.py +0 -0
  481. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/evaluation/test_stats.py +0 -0
  482. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/geometry/test_rotated_bbox.py +0 -0
  483. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/extract/test_extend_cost_stats.py +0 -0
  484. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/extract/test_extend_schema_adapter.py +0 -0
  485. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_aeddix_alpine_ocr_kdl.py +0 -0
  486. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_amazon_nova.py +0 -0
  487. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +0 -0
  488. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_anyformat.py +0 -0
  489. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_azure_document_intelligence_layout.py +0 -0
  490. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_chandra2_multipage.py +0 -0
  491. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_databricks_chart_descriptions.py +0 -0
  492. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_databricks_rest.py +0 -0
  493. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_datalab.py +0 -0
  494. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_deepseekocr2_multipage.py +0 -0
  495. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_docai.py +0 -0
  496. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_extend_parse_pages.py +0 -0
  497. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_falconocr_multipage.py +0 -0
  498. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_gemma4_multipage.py +0 -0
  499. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_glm_zai.py +0 -0
  500. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_google_parse_pricing.py +0 -0
  501. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_granite_vision_multipage.py +0 -0
  502. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_hpd_parsing.py +0 -0
  503. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_hunyuanocr.py +0 -0
  504. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_kdl_frontier_nano.py +0 -0
  505. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_layout_coordinate_frames.py +0 -0
  506. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_layout_utils.py +0 -0
  507. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_lightonocr_3.py +0 -0
  508. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_liteparse_layout.py +0 -0
  509. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_llamaparse_picture_type.py +0 -0
  510. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_llamaparse_polling.py +0 -0
  511. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_llamaparse_usage_metadata.py +0 -0
  512. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_normalization.py +0 -0
  513. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_null_page_fields.py +0 -0
  514. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_mineru25_multipage.py +0 -0
  515. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_mineru2605pro_multipage.py +0 -0
  516. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_mineru_diffusion_multipage.py +0 -0
  517. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_minicpm_ocr.py +0 -0
  518. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_nemotron_omni_multipage.py +0 -0
  519. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_nemotron_parse_3_5.py +0 -0
  520. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_nutrient_dws_errors.py +0 -0
  521. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_nutrient_dws_markdown.py +0 -0
  522. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +0 -0
  523. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_ovisocr2.py +0 -0
  524. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_ovisocr3.py +0 -0
  525. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_paddleocr_multipage.py +0 -0
  526. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_pymupdf4llm.py +0 -0
  527. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_qwen.py +0 -0
  528. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_surya2_multipage.py +0 -0
  529. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_teleocr.py +0 -0
  530. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_textract_cost.py +0 -0
  531. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_unlimitedocr2.py +0 -0
  532. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_unlimitedocr_multipage.py +0 -0
  533. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_upstage.py +0 -0
  534. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_warp_ingest.py +0 -0
  535. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/providers/parse/test_wevisdoc.py +0 -0
  536. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/test_cli.py +0 -0
  537. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/test_layout_extraction.py +0 -0
  538. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/test_parse_pipelines.py +0 -0
  539. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/test_renormalize.py +0 -0
  540. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/inference/test_runner.py +0 -0
  541. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_cases/test_loader.py +0 -0
  542. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_cases/test_loader_stem_twins.py +0 -0
  543. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_cases/test_parse_rule_schemas.py +0 -0
  544. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_cases/test_rule_ids.py +0 -0
  545. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_evaluation_schema_extra_fields.py +0 -0
  546. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/parse_bench/test_layout_label_mapping_code_alias.py +0 -0
  547. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_data_dir_routing.py +0 -0
  548. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_llamaparse_base_url.py +0 -0
  549. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_pulse_public_api.py +0 -0
  550. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_repetition_cli.py +0 -0
  551. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_text_v21.py +0 -0
  552. {parse_bench-1.0.6 → parse_bench-2.0.0}/tests/test_text_v21_isolation.py +0 -0
@@ -219,4 +219,5 @@ data/
219
219
  CLAUDE.md
220
220
  .DS_Store
221
221
  output/
222
- data_small/
222
+ data_small/
223
+ data_parsebench-2/
@@ -4,14 +4,85 @@ All notable changes to `parse-bench` are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
5
5
  [Semantic Versioning](https://semver.org/).
6
6
 
7
- ## [1.0.4] - 2026-09-04
7
+ ## [Unreleased]
8
+
9
+ ## [2.0.0] - 2026-11-11
10
+
11
+ ParseBench 2: `--dataset parsebench-2` runs the 13 ParseBench 2 subsets and scores them into six dimensions and an
12
+ overall score. The extended scorers are synced with the internal harness. Scores change for
13
+ tables, formatting and layout (see Scoring); ParseBench 2 scores are not comparable with ParseBench v1
14
+ scores.
15
+
16
+ ### Scoring (changes evaluation numbers)
17
+ - `table_next`: a blank cell drawn as a dash is no longer an error wherever it sits (row label, section row, corner
18
+ cell), as was already the case for values; a dash written over a value is still a wrong value. A label that takes
19
+ another name of the reference (headers swapped or shifted, so the values sit under the wrong label) or whose number
20
+ changes by an inserted decimal point ("2025" read "202.5") is now a critical error, where it was read as a
21
+ rewording. A `th` row of column numbers that holds a formula is a header row, and a reference whose values are all
22
+ empty markers ("None", "N/A") is scored. About 1.5% of page scores change on saved outputs; the Tables score of a
23
+ system moves by about 0.1 point or less.
24
+ - `table_next`: a whole cell holding one of the protocol's bracketed mark words reads as the mark it names:
25
+ `[yes]`, `[checked]`, `[icon: bullet]` as checked, `[unchecked]` / `[empty]` as unchecked, `[no]` / `[cross]` as `✗`.
26
+ Against a reference `●` these words scored 0.6, below an empty cell; they now score 0.95 like `✓`.
27
+ - `formatting_v2`: a strike written with a space inside its delimiters (`~~Risk ~~Factors`) reads as struck instead of
28
+ plain text, and no longer pairs with a later span's `~~`. `a.`, `b)` and `i.` are list markers like `1.`, and a marker
29
+ inside the item's opening style (`~~a. Violation~~`) reads the same as one outside it (`a. ~~Violation~~`). Scores on
30
+ strikeout pages written this way rise (four audited LlamaParse pages go from 0.00–0.71 to 1.00).
31
+ - `formatting_v2`: Markdown delimiters inside HTML table cells stay literal (`<td>**x**</td>` is not bold), and a link
32
+ label counts as underlined only where the reference underlines that text; elsewhere link markup is neutral.
33
+ `table_next`: a non-numeric cell that only partly matches is charged as "value partly differs", not "unit lost"
34
+ (same severity).
35
+ - `layout_grounding_pass_rate`: a predicted box on an ignore/optional element inside a table (a checkbox mark) is
36
+ neutral instead of a garbage child of the table.
37
+ - Visual Grounding attribution for PARSE results no longer depends on whether the raw provider response is
38
+ present. Cross-evaluation evaluated a synthetic layout result and re-resolved its adapter from it, which only
39
+ sees `raw_output`; LlamaParse-style adapters then lost the pages read from `ParseOutput.layout_pages` and fell
40
+ back to prediction-level blocks that drop chart and table content. The runner now passes the adapter that
41
+ produced the layout to the evaluator. Published results carry no raw response, so Visual Grounding rises for
42
+ providers read through the LlamaParse adapter (on LlamaParse Agentic, 57.77 -> 69.42 for the same outputs,
43
+ matching a local run that kept the raw response).
44
+ - A layout page the provider returned no layout for ("<adapter> requires non-empty layout_pages") now counts as 0
45
+ in the aggregate, like output that cannot be adapted to a `LayoutOutput` already did. It was treated as a harness
46
+ error and silently dropped from the denominator, so a pipeline that returned nothing on its hardest pages scored
47
+ as if those pages did not exist. Visual Grounding drops for affected pipelines (median 3 of 500 pages; up to 78
48
+ for some lightweight models).
49
+ - Layout adapters read `layout_pages` whose boxes are 0-1 fractions of the page, which `LayoutSegmentIR` allows
50
+ alongside page units. Fractional pages are scaled to page units before projection, for detection and attribution
51
+ alike. Without it, providers without a dedicated adapter (Surya, MinerU, Unlimited-OCR, Qianfan, LightOnOCR, GLM,
52
+ Mistral OCR, Nova) and Nutrient DWS localized nothing and scored 0 Visual Grounding.
53
+ - The LlamaParse layout adapter reads `raw_output["pages"]` only when it is LlamaParse's own page payload (items with
54
+ `bBox`/`layoutAwareBbox`). Providers that keep a native `pages` list (Mistral OCR, GLM, Nova) now fall through to
55
+ their normalized `layout_pages` instead of yielding no boxes.
56
+ - The Upstage label mapper accepts canonical labels (`Page-header`, `Text`) as well as Upstage categories, and
57
+ `openai_compatible_vlm_layout` (DeepSeek parse-with-layout) maps through the Qwen3-VL label indices like the other
58
+ parse-with-layout VLMs. Both previously raised on every page.
8
59
 
9
60
  ### Added
10
- - `LayoutDetectionModel.FIRECRAWL_LAYOUT` (with a `LAYOUT_MODEL_INFO` entry) so
11
- Firecrawl parse output can be cross-evaluated on the layout-attribution
12
- datasets, matching the other layout-capable parse providers.
61
+ - Leaderboard accountability: `leaderboard/results.yaml` ties every `leaderboard.csv` row to its published outputs
62
+ in `llamaindex/ParseBench-results`, `leaderboard.csv` gains a `Verified` column, and `scripts/leaderboard/`
63
+ re-scores rows from those outputs. Two workflows use it: *Leaderboard verification* checks
64
+ leaderboard PRs against a re-score, and *Leaderboard re-score* re-scores every verified row daily when the harness
65
+ changes and opens a PR. See `leaderboard/README.md`.
66
+ - `--dataset parsebench-2` on `download`, `status` and `run` for ParseBench 2 (`llamaindex/ParseBench-2`, 13 subsets,
67
+ downloaded to `./data_parsebench-2`). `parse-bench run <pipeline> --dataset parsebench-2` runs inference on each
68
+ subset folder and scores every subset with results with the extended scorers (`evaluation run --next`) into the six
69
+ dimensions and the overall score, written to `output/parsebench-2/_score/<pipeline>/_next_score.json`. `--group`
70
+ takes subset names (`charts,tables`) to run only those.
71
+ - The `markdown_attribution` rule and its scorer (`md_attribution_v1_*` metrics, scorer version 2), ported from the
72
+ internal harness. ParseBench 2's `layout` subset carries one on each of its 86 `markdown_block_layout` pages,
73
+ which failed to load before. Its metrics are diagnostics: the Layout dimension stays `layout_grounding_pass_rate`.
74
+ Re-scoring the internal Azure Document Intelligence layout run with this code reproduces all of its layout and
75
+ attribution aggregates and every page's layout score.
13
76
 
14
- ## [Unreleased]
77
+ ### Fixed
78
+ - `tables_values` rules no longer crash scoring when the table is matched but too few cells match exactly.
79
+ That failure path returned a third tuple item, which the metric read as a score
80
+ (`could not convert string to float`), so the page lost every rule result instead of failing this one rule.
81
+ Such pages are now scored, with the rule reported as failed.
82
+
83
+ ## [1.0.7] - 2026-11-01
84
+
85
+ Released as 1.0.5 to 1.0.7 without per-version entries; this lists what shipped by 1.0.7.
15
86
 
16
87
  ### Added
17
88
  - `repetition_overshoot`, a built-in rule that fails an output repeating anything (a leader, a unit, a token, a line,
@@ -19,21 +90,6 @@ All notable changes to `parse-bench` are recorded here. The format follows
19
90
  each of your own PDFs, budgeted from its text layer. See `docs/repetition-overshoot.md`.
20
91
  - `--dataset` on `download`, `status` and `run` accepts any HuggingFace dataset repo id (`org/name`) in the ParseBench
21
92
  layout, downloaded to `./data/<name>`.
22
-
23
- ### Fixed
24
- - Layout attribution no longer crashes on layout rules without an `ro_index`.
25
- `LayoutDetectionEvaluator` dumps rules with `ro_index=None`, which
26
- `parse_gt_elements` kept, so the reading-order sort raised `TypeError` and
27
- the page was dropped. A null `ro_index` now reads as `0`, as an absent key
28
- already did.
29
- - `diagram_graph` rules no longer crash when their `reference_image` resolves.
30
- The rule reached for `rules_image.thumbnail_data_uri`, a module that only
31
- exists in the internal harness, so scoring a diagram with a reference render
32
- raised `ModuleNotFoundError` instead of returning a score. The crash was
33
- latent until 1.0.1 started forwarding the test case and source paths, which
34
- is what lets the reference resolve in the first place.
35
-
36
- ### Added
37
93
  - `ovisocr3_vllm` pipeline and `ovisocr3` provider for OvisOCR3
38
94
  (`OVISOCR3_SERVER_URL`). Sends the official structured-parsing prompt, re-reads
39
95
  each chart region with the official chart-parsing prompt, and scores layout
@@ -66,6 +122,33 @@ All notable changes to `parse-bench` are recorded here. The format follows
66
122
  now computed with a small numpy implementation that matches
67
123
  `sklearn.metrics.average_precision_score` (including tied-score handling),
68
124
  so evaluation numbers are unchanged. `scipy` remains a core dependency.
125
+ - Built-in providers now register on the first `create_provider` call instead
126
+ of when `parse_bench.inference.providers` (or any module under it) is
127
+ imported. Importing `parse_bench.extensions` or the layout adapter and label
128
+ mapper registries no longer loads every provider and its SDK: about 0.4 s
129
+ instead of about 4.8 s in a full install. The provider subpackages expose
130
+ `load_providers()` and the registry `load_builtin_providers()`; code that
131
+ read `_PROVIDER_REGISTRY` directly should call the latter first.
132
+
133
+ ### Fixed
134
+ - Layout attribution no longer crashes on layout rules without an `ro_index`.
135
+ `LayoutDetectionEvaluator` dumps rules with `ro_index=None`, which
136
+ `parse_gt_elements` kept, so the reading-order sort raised `TypeError` and
137
+ the page was dropped. A null `ro_index` now reads as `0`, as an absent key
138
+ already did.
139
+ - `diagram_graph` rules no longer crash when their `reference_image` resolves.
140
+ The rule reached for `rules_image.thumbnail_data_uri`, a module that only
141
+ exists in the internal harness, so scoring a diagram with a reference render
142
+ raised `ModuleNotFoundError` instead of returning a score. The crash was
143
+ latent until 1.0.1 started forwarding the test case and source paths, which
144
+ is what lets the reference resolve in the first place.
145
+
146
+ ## [1.0.4] - 2026-09-04
147
+
148
+ ### Added
149
+ - `LayoutDetectionModel.FIRECRAWL_LAYOUT` (with a `LAYOUT_MODEL_INFO` entry) so
150
+ Firecrawl parse output can be cross-evaluated on the layout-attribution
151
+ datasets, matching the other layout-capable parse providers.
69
152
 
70
153
  ## [1.0.2] - 2026-09-04
71
154
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parse-bench
3
- Version: 1.0.6
3
+ Version: 2.0.0
4
4
  Summary: ParseBench: a benchmark and evaluation harness for document parsing systems on real-world enterprise documents
5
5
  Project-URL: Homepage, https://parsebench.ai
6
6
  Project-URL: Repository, https://github.com/run-llama/ParseBench
@@ -38,10 +38,12 @@ Requires-Dist: markdown>=3.0
38
38
  Requires-Dist: numpy>=1.24.0
39
39
  Requires-Dist: pandas>=2.0.0
40
40
  Requires-Dist: pydantic>=2.0.0
41
+ Requires-Dist: pypdfium2>=4.30.0
41
42
  Requires-Dist: python-dateutil>=2.9.0
42
43
  Requires-Dist: python-dotenv>=1.0.0
43
44
  Requires-Dist: python-levenshtein>=0.25.0
44
45
  Requires-Dist: rapidfuzz>=3.0.0
46
+ Requires-Dist: regex>=2024.0.0
45
47
  Requires-Dist: rich>=13.7.0
46
48
  Requires-Dist: scipy>=1.16.3
47
49
  Requires-Dist: unidecode>=1.3.0
@@ -138,42 +140,83 @@ Description-Content-Type: text/markdown
138
140
  [![Website](https://img.shields.io/badge/Website-parsebench.ai-blue)](https://parsebench.ai)
139
141
  [![arXiv](https://img.shields.io/badge/arXiv-2604.08538-b31b1b.svg)](https://arxiv.org/abs/2604.08538)
140
142
  [![Dataset](https://img.shields.io/badge/HuggingFace-Dataset-yellow)](https://huggingface.co/datasets/llamaindex/ParseBench)
143
+ [![ParseBench 2](https://img.shields.io/badge/HuggingFace-ParseBench_2-orange)](https://huggingface.co/datasets/llamaindex/ParseBench-2)
141
144
  [![Papers with Code: SOTA on ParseBench](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge.svg?eval=32432&live=1)](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge-link?eval=32432)
142
145
  [![License](https://img.shields.io/badge/License-Apache_2.0-green.svg)](LICENSE)
143
146
 
147
+ > **New: [ParseBench 2](#parsebench-2)** — 4,317 test cases in six dimensions (now with forms), scored with
148
+ > severity-aware metrics. Run it with `parse-bench run <pipeline> --dataset parsebench-2`.
149
+
144
150
  > **Related:** For schema-guided enterprise document extraction, see our companion benchmark [ExtractBench](https://github.com/run-llama/ExtractBench).
145
151
 
146
152
  **ParseBench** is a benchmark for evaluating how well document parsing tools convert PDFs into structured output that AI agents can reliably act on. It tests whether parsed output preserves the structure and meaning needed for autonomous decisions — not just whether it looks similar to a reference text.
147
153
 
148
- The benchmark covers ~2,000 human-verified pages from real enterprise documents (insurance, finance, government), organized around five capability dimensions, each targeting a failure mode that breaks production agent workflows.
154
+ The original benchmark (ParseBench v1) covers ~2,000 human-verified pages from real enterprise documents (insurance, finance, government), organized around five capability dimensions, each targeting a failure mode that breaks production agent workflows. [ParseBench 2](#parsebench-2) extends it with more pages, a forms dimension and metrics that score each error by how much it matters.
149
155
 
150
156
  <p align="center">
151
157
  <img src="docs/parsebench_teaser.png" alt="ParseBench overview: five capability dimensions" width="100%">
152
158
  </p>
153
159
 
154
- ## Leaderboard
160
+ ## ParseBench 2
161
+
162
+ [ParseBench 2](https://huggingface.co/datasets/llamaindex/ParseBench-2) combines broad coverage of real-world documents with metrics calibrated to how much each error matters:
163
+
164
+ - **Six dimensions.** Text, formatting, tables, charts, layout (visual grounding) and the new forms dimension, with 600 form pages.
165
+ - **Severity-aware scoring.** A page score is the lower of a content-recovery score and a severity cap, so recovering most of a page cannot hide a serious error — a changed number, a flipped negation, swapped table headers or a misread form value. Changes between supported formats that keep the same information cost nothing.
166
+ - **Calibrated against stated priorities.** The metrics are tuned against 330 controlled scenarios in six severity test suites, each with a target score drop (critical, major, minor or harmless), and check for over 140 error types.
167
+ - **4,317 page-level test cases from 2,645 documents.** The revised ParseBench v1 pages, with more complete answer keys (every chart has its full data table), plus targeted datasets of hard cases: complex table headers, financial, insurance and dense tables, headings, strikeout, underline and government forms.
168
+
169
+ One command downloads the dataset to `./data_parsebench-2`, runs a pipeline on every subset and writes the six dimension scores and the overall score to `output/parsebench-2/_score/<pipeline>/_next_score.json`:
170
+
171
+ ```bash
172
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2
173
+
174
+ # Only some subsets; every subset that already has results is still scored
175
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2 --group charts,tables
176
+
177
+ # Check the download and see the case count of each subset
178
+ uv run parse-bench status --dataset parsebench-2
179
+ ```
180
+
181
+ The overall score is the unweighted mean of the six dimensions. Within a dimension, page scores are averaged per dataset and the datasets are combined with fixed weights, so collecting more pages for one capability does not give it more influence:
182
+
183
+ | Dimension | Datasets (`--group` name) | Cases | Metric |
184
+ |---|---|---:|---|
185
+ | Text | `text` | 508 | `text_next` |
186
+ | Formatting | `text` (3/4), `headings` (1/8), `strikeout` (1/16), `underline` (1/16) | 508 + 353 | `formatting_v2` |
187
+ | Tables | `tables` (1/2), `complex_table_headers`, `financial_tables`, `insurance_filing_tables`, `dense_tables` (1/8 each) | 1,753 | `table_next` |
188
+ | Charts | `charts` | 568 | `chart_next` |
189
+ | Layout | `layout` | 535 | `layout_grounding_pass_rate` |
190
+ | Forms | `forms` (7/8), `fillable_forms` (1/8) | 600 | `forms_v2` |
191
+
192
+ To score outputs from your own parser, write them in the ParseBench results layout and run `parse-bench evaluation run <dir> --next=SUBSET=RESULTS_DIR::TEST_CASES_DIR,...`. ParseBench 2 scores are not comparable with ParseBench v1 scores; the leaderboard below is ParseBench v1.
193
+
194
+ ## Leaderboard (ParseBench v1)
155
195
 
156
196
  <!-- LEADERBOARD:START -->
157
197
  _Top 10 by Overall score. For the full sortable, filterable leaderboard, see [parsebench.ai](https://parsebench.ai); for raw data, see [leaderboard.csv](leaderboard.csv)._
158
198
 
159
199
  | Rank | Provider | Category | Overall | Tables | Charts | Content Faith. | Sem. Format. | Visual Ground. | ¢ / Page |
160
200
  |---:|---|---|---:|---:|---:|---:|---:|---:|---:|
161
- | 1 | LlamaParse Agentic Plus | LlamaParse | 86.61 | 93.37 | 90.19 | 88.74 | 86.54 | 74.21 | 5.62¢ |
162
- | 2 | LlamaParse Agentic | LlamaParse | 83.07 | 88.88 | 81.47 | 87.63 | 84.25 | 73.12 | 1.25¢ |
163
- | 3 | Pulse Ultra 2 | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
164
- | 4 | Upstage Document Parse 2 (Enhanced) | VLM - Proprietary | 80.51 | 89.49 | 77.26 | 87.36 | 76.88 | 71.56 | 3.00¢ |
165
- | 5 | anyformat (Standard) | Commercial - Startup APIs | 80.30 | 86.46 | 85.56 | 87.35 | 79.04 | 63.07 | 4.30¢ |
166
- | 6 | Anthropic Opus 5.5 (Effort High) | VLM - Proprietary | 78.89 | 94.25 | 70.89 | 91.72 | 77.04 | 60.53 | 6.13¢ |
167
- | 7 | oi-parser | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
168
- | 8 | Anthropic Fable 5.1 | VLM - Proprietary | 78.12 | 91.52 | 67.06 | 91.19 | 76.52 | 64.32 | 16.05¢ |
169
- | 9 | LlamaParse Cost Effective | LlamaParse | 78.02 | 85.14 | 72.99 | 87.43 | 78.29 | 66.26 | 0.38¢ |
170
- | 10 | rakedoc-nano | VLM - Open Weight | 77.23 | 86.44 | 64.89 | 88.84 | 71.68 | 74.28 | — |
201
+ | 1 | LlamaParse Agentic Plus | LlamaParse | 86.69 | 93.27 | 92.19 | 89.74 | 82.84 | 75.43 | 5.62¢ |
202
+ | 2 | LlamaParse Agentic | LlamaParse | 82.83 | 90.90 | 81.20 | 87.84 | 84.81 | 69.42 | 1.25¢ |
203
+ | 3 | Pulse Ultra 2 † | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
204
+ | 4 | Upstage Document Parse 2 (Enhanced) | VLM - Proprietary | 80.64 | 89.48 | 77.50 | 87.68 | 76.68 | 71.84 | 3.00¢ |
205
+ | 5 | anyformat (Standard) | Commercial - Startup APIs | 80.05 | 86.84 | 85.01 | 86.39 | 79.25 | 62.74 | 4.30¢ |
206
+ | 6 | KDL-Frontier-Parser-nano-v2 | VLM - Open Weight | 79.07 | 86.19 | 69.14 | 87.77 | 76.91 | 75.33 | — |
207
+ | 7 | Anthropic Opus 5.5 (Effort High) | VLM - Proprietary | 78.80 | 94.26 | 70.89 | 91.25 | 77.06 | 60.56 | 6.13¢ |
208
+ | 8 | oi-parser † | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
209
+ | 9 | Anthropic Fable 5.1 | VLM - Proprietary | 77.81 | 91.53 | 66.93 | 90.77 | 76.02 | 63.81 | 16.05¢ |
210
+ | 10 | LlamaParse Cost Effective | LlamaParse | 77.68 | 86.72 | 73.98 | 87.32 | 78.14 | 62.22 | 0.38¢ |
211
+
212
+ † Unverified: no published outputs in [ParseBench-results](https://huggingface.co/datasets/llamaindex/ParseBench-results); scores as submitted.
171
213
  <!-- LEADERBOARD:END -->
172
214
 
173
215
  **Inclusion criteria:**
174
216
  1. The model or API needs to be publicly accessible, either via open weights or a self-serve API that any user can sign up for.
175
217
  2. The benchmark run needs to finish within a reasonable time (roughly single-digit hours).
176
218
  3. We can adjust concurrency based on the provider's recommended settings, but providers should not require custom framework changes, so the evaluation stays fair across models.
219
+ 4. The row's per-document outputs are published to [ParseBench-results](https://huggingface.co/datasets/llamaindex/ParseBench-results). Published rows are re-scored automatically whenever the harness changes; see [leaderboard/README.md](leaderboard/README.md).
177
220
 
178
221
  ## Quick Start
179
222
 
@@ -198,6 +241,9 @@ uv run parse-bench run llamaparse_agentic --test
198
241
  # Full benchmark run (replace llamaparse_agentic with any pipeline name, see "Available Pipelines" below)
199
242
  uv run parse-bench run llamaparse_agentic
200
243
 
244
+ # ParseBench 2: all 13 subsets, scored into six dimensions and an overall score
245
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2
246
+
201
247
  # View interactive reports in your browser
202
248
  uv run parse-bench serve llamaparse_agentic
203
249
  ```
@@ -235,7 +281,7 @@ A **pipeline** is a document parsing tool or configuration that you want to eval
235
281
 
236
282
  </details>
237
283
 
238
- ## Dataset
284
+ ## Dataset (ParseBench v1)
239
285
 
240
286
  Hosted on HuggingFace: [`llamaindex/ParseBench`](https://huggingface.co/datasets/llamaindex/ParseBench)
241
287
 
@@ -492,6 +538,7 @@ src/parse_bench/
492
538
 
493
539
  - **Paper**: [arXiv:2604.08538](https://arxiv.org/abs/2604.08538)
494
540
  - **HuggingFace Dataset**: [llamaindex/ParseBench](https://huggingface.co/datasets/llamaindex/ParseBench)
541
+ - **ParseBench 2 Dataset**: [llamaindex/ParseBench-2](https://huggingface.co/datasets/llamaindex/ParseBench-2)
495
542
  - **Code**: [run-llama/ParseBench](https://github.com/run-llama/ParseBench)
496
543
  - **ExtractBench**: [run-llama/ExtractBench](https://github.com/run-llama/ExtractBench) - A Benchmark for Schema-Guided Enterprise Document Extraction
497
544
 
@@ -3,42 +3,83 @@
3
3
  [![Website](https://img.shields.io/badge/Website-parsebench.ai-blue)](https://parsebench.ai)
4
4
  [![arXiv](https://img.shields.io/badge/arXiv-2604.08538-b31b1b.svg)](https://arxiv.org/abs/2604.08538)
5
5
  [![Dataset](https://img.shields.io/badge/HuggingFace-Dataset-yellow)](https://huggingface.co/datasets/llamaindex/ParseBench)
6
+ [![ParseBench 2](https://img.shields.io/badge/HuggingFace-ParseBench_2-orange)](https://huggingface.co/datasets/llamaindex/ParseBench-2)
6
7
  [![Papers with Code: SOTA on ParseBench](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge.svg?eval=32432&live=1)](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge-link?eval=32432)
7
8
  [![License](https://img.shields.io/badge/License-Apache_2.0-green.svg)](LICENSE)
8
9
 
10
+ > **New: [ParseBench 2](#parsebench-2)** — 4,317 test cases in six dimensions (now with forms), scored with
11
+ > severity-aware metrics. Run it with `parse-bench run <pipeline> --dataset parsebench-2`.
12
+
9
13
  > **Related:** For schema-guided enterprise document extraction, see our companion benchmark [ExtractBench](https://github.com/run-llama/ExtractBench).
10
14
 
11
15
  **ParseBench** is a benchmark for evaluating how well document parsing tools convert PDFs into structured output that AI agents can reliably act on. It tests whether parsed output preserves the structure and meaning needed for autonomous decisions — not just whether it looks similar to a reference text.
12
16
 
13
- The benchmark covers ~2,000 human-verified pages from real enterprise documents (insurance, finance, government), organized around five capability dimensions, each targeting a failure mode that breaks production agent workflows.
17
+ The original benchmark (ParseBench v1) covers ~2,000 human-verified pages from real enterprise documents (insurance, finance, government), organized around five capability dimensions, each targeting a failure mode that breaks production agent workflows. [ParseBench 2](#parsebench-2) extends it with more pages, a forms dimension and metrics that score each error by how much it matters.
14
18
 
15
19
  <p align="center">
16
20
  <img src="docs/parsebench_teaser.png" alt="ParseBench overview: five capability dimensions" width="100%">
17
21
  </p>
18
22
 
19
- ## Leaderboard
23
+ ## ParseBench 2
24
+
25
+ [ParseBench 2](https://huggingface.co/datasets/llamaindex/ParseBench-2) combines broad coverage of real-world documents with metrics calibrated to how much each error matters:
26
+
27
+ - **Six dimensions.** Text, formatting, tables, charts, layout (visual grounding) and the new forms dimension, with 600 form pages.
28
+ - **Severity-aware scoring.** A page score is the lower of a content-recovery score and a severity cap, so recovering most of a page cannot hide a serious error — a changed number, a flipped negation, swapped table headers or a misread form value. Changes between supported formats that keep the same information cost nothing.
29
+ - **Calibrated against stated priorities.** The metrics are tuned against 330 controlled scenarios in six severity test suites, each with a target score drop (critical, major, minor or harmless), and check for over 140 error types.
30
+ - **4,317 page-level test cases from 2,645 documents.** The revised ParseBench v1 pages, with more complete answer keys (every chart has its full data table), plus targeted datasets of hard cases: complex table headers, financial, insurance and dense tables, headings, strikeout, underline and government forms.
31
+
32
+ One command downloads the dataset to `./data_parsebench-2`, runs a pipeline on every subset and writes the six dimension scores and the overall score to `output/parsebench-2/_score/<pipeline>/_next_score.json`:
33
+
34
+ ```bash
35
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2
36
+
37
+ # Only some subsets; every subset that already has results is still scored
38
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2 --group charts,tables
39
+
40
+ # Check the download and see the case count of each subset
41
+ uv run parse-bench status --dataset parsebench-2
42
+ ```
43
+
44
+ The overall score is the unweighted mean of the six dimensions. Within a dimension, page scores are averaged per dataset and the datasets are combined with fixed weights, so collecting more pages for one capability does not give it more influence:
45
+
46
+ | Dimension | Datasets (`--group` name) | Cases | Metric |
47
+ |---|---|---:|---|
48
+ | Text | `text` | 508 | `text_next` |
49
+ | Formatting | `text` (3/4), `headings` (1/8), `strikeout` (1/16), `underline` (1/16) | 508 + 353 | `formatting_v2` |
50
+ | Tables | `tables` (1/2), `complex_table_headers`, `financial_tables`, `insurance_filing_tables`, `dense_tables` (1/8 each) | 1,753 | `table_next` |
51
+ | Charts | `charts` | 568 | `chart_next` |
52
+ | Layout | `layout` | 535 | `layout_grounding_pass_rate` |
53
+ | Forms | `forms` (7/8), `fillable_forms` (1/8) | 600 | `forms_v2` |
54
+
55
+ To score outputs from your own parser, write them in the ParseBench results layout and run `parse-bench evaluation run <dir> --next=SUBSET=RESULTS_DIR::TEST_CASES_DIR,...`. ParseBench 2 scores are not comparable with ParseBench v1 scores; the leaderboard below is ParseBench v1.
56
+
57
+ ## Leaderboard (ParseBench v1)
20
58
 
21
59
  <!-- LEADERBOARD:START -->
22
60
  _Top 10 by Overall score. For the full sortable, filterable leaderboard, see [parsebench.ai](https://parsebench.ai); for raw data, see [leaderboard.csv](leaderboard.csv)._
23
61
 
24
62
  | Rank | Provider | Category | Overall | Tables | Charts | Content Faith. | Sem. Format. | Visual Ground. | ¢ / Page |
25
63
  |---:|---|---|---:|---:|---:|---:|---:|---:|---:|
26
- | 1 | LlamaParse Agentic Plus | LlamaParse | 86.61 | 93.37 | 90.19 | 88.74 | 86.54 | 74.21 | 5.62¢ |
27
- | 2 | LlamaParse Agentic | LlamaParse | 83.07 | 88.88 | 81.47 | 87.63 | 84.25 | 73.12 | 1.25¢ |
28
- | 3 | Pulse Ultra 2 | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
29
- | 4 | Upstage Document Parse 2 (Enhanced) | VLM - Proprietary | 80.51 | 89.49 | 77.26 | 87.36 | 76.88 | 71.56 | 3.00¢ |
30
- | 5 | anyformat (Standard) | Commercial - Startup APIs | 80.30 | 86.46 | 85.56 | 87.35 | 79.04 | 63.07 | 4.30¢ |
31
- | 6 | Anthropic Opus 5.5 (Effort High) | VLM - Proprietary | 78.89 | 94.25 | 70.89 | 91.72 | 77.04 | 60.53 | 6.13¢ |
32
- | 7 | oi-parser | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
33
- | 8 | Anthropic Fable 5.1 | VLM - Proprietary | 78.12 | 91.52 | 67.06 | 91.19 | 76.52 | 64.32 | 16.05¢ |
34
- | 9 | LlamaParse Cost Effective | LlamaParse | 78.02 | 85.14 | 72.99 | 87.43 | 78.29 | 66.26 | 0.38¢ |
35
- | 10 | rakedoc-nano | VLM - Open Weight | 77.23 | 86.44 | 64.89 | 88.84 | 71.68 | 74.28 | — |
64
+ | 1 | LlamaParse Agentic Plus | LlamaParse | 86.69 | 93.27 | 92.19 | 89.74 | 82.84 | 75.43 | 5.62¢ |
65
+ | 2 | LlamaParse Agentic | LlamaParse | 82.83 | 90.90 | 81.20 | 87.84 | 84.81 | 69.42 | 1.25¢ |
66
+ | 3 | Pulse Ultra 2 † | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
67
+ | 4 | Upstage Document Parse 2 (Enhanced) | VLM - Proprietary | 80.64 | 89.48 | 77.50 | 87.68 | 76.68 | 71.84 | 3.00¢ |
68
+ | 5 | anyformat (Standard) | Commercial - Startup APIs | 80.05 | 86.84 | 85.01 | 86.39 | 79.25 | 62.74 | 4.30¢ |
69
+ | 6 | KDL-Frontier-Parser-nano-v2 | VLM - Open Weight | 79.07 | 86.19 | 69.14 | 87.77 | 76.91 | 75.33 | — |
70
+ | 7 | Anthropic Opus 5.5 (Effort High) | VLM - Proprietary | 78.80 | 94.26 | 70.89 | 91.25 | 77.06 | 60.56 | 6.13¢ |
71
+ | 8 | oi-parser † | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
72
+ | 9 | Anthropic Fable 5.1 | VLM - Proprietary | 77.81 | 91.53 | 66.93 | 90.77 | 76.02 | 63.81 | 16.05¢ |
73
+ | 10 | LlamaParse Cost Effective | LlamaParse | 77.68 | 86.72 | 73.98 | 87.32 | 78.14 | 62.22 | 0.38¢ |
74
+
75
+ † Unverified: no published outputs in [ParseBench-results](https://huggingface.co/datasets/llamaindex/ParseBench-results); scores as submitted.
36
76
  <!-- LEADERBOARD:END -->
37
77
 
38
78
  **Inclusion criteria:**
39
79
  1. The model or API needs to be publicly accessible, either via open weights or a self-serve API that any user can sign up for.
40
80
  2. The benchmark run needs to finish within a reasonable time (roughly single-digit hours).
41
81
  3. We can adjust concurrency based on the provider's recommended settings, but providers should not require custom framework changes, so the evaluation stays fair across models.
82
+ 4. The row's per-document outputs are published to [ParseBench-results](https://huggingface.co/datasets/llamaindex/ParseBench-results). Published rows are re-scored automatically whenever the harness changes; see [leaderboard/README.md](leaderboard/README.md).
42
83
 
43
84
  ## Quick Start
44
85
 
@@ -63,6 +104,9 @@ uv run parse-bench run llamaparse_agentic --test
63
104
  # Full benchmark run (replace llamaparse_agentic with any pipeline name, see "Available Pipelines" below)
64
105
  uv run parse-bench run llamaparse_agentic
65
106
 
107
+ # ParseBench 2: all 13 subsets, scored into six dimensions and an overall score
108
+ uv run parse-bench run llamaparse_agentic --dataset parsebench-2
109
+
66
110
  # View interactive reports in your browser
67
111
  uv run parse-bench serve llamaparse_agentic
68
112
  ```
@@ -100,7 +144,7 @@ A **pipeline** is a document parsing tool or configuration that you want to eval
100
144
 
101
145
  </details>
102
146
 
103
- ## Dataset
147
+ ## Dataset (ParseBench v1)
104
148
 
105
149
  Hosted on HuggingFace: [`llamaindex/ParseBench`](https://huggingface.co/datasets/llamaindex/ParseBench)
106
150
 
@@ -357,6 +401,7 @@ src/parse_bench/
357
401
 
358
402
  - **Paper**: [arXiv:2604.08538](https://arxiv.org/abs/2604.08538)
359
403
  - **HuggingFace Dataset**: [llamaindex/ParseBench](https://huggingface.co/datasets/llamaindex/ParseBench)
404
+ - **ParseBench 2 Dataset**: [llamaindex/ParseBench-2](https://huggingface.co/datasets/llamaindex/ParseBench-2)
360
405
  - **Code**: [run-llama/ParseBench](https://github.com/run-llama/ParseBench)
361
406
  - **ExtractBench**: [run-llama/ExtractBench](https://github.com/run-llama/ExtractBench) - A Benchmark for Schema-Guided Enterprise Document Extraction
362
407
 
@@ -36,10 +36,12 @@ dependencies = [
36
36
  "numpy>=1.24.0",
37
37
  "pandas>=2.0.0",
38
38
  "pydantic>=2.0.0",
39
+ "pypdfium2>=4.30.0",
39
40
  "python-dateutil>=2.9.0",
40
41
  "python-dotenv>=1.0.0",
41
42
  "python-Levenshtein>=0.25.0",
42
43
  "rapidfuzz>=3.0.0",
44
+ "regex>=2024.0.0",
43
45
  "rich>=13.7.0",
44
46
  "scipy>=1.16.3",
45
47
  "unidecode>=1.3.0",
@@ -1,3 +1,3 @@
1
1
  """Document parsing evaluation system for competitive benchmarking."""
2
2
 
3
- __version__ = "1.0.6"
3
+ __version__ = "2.0.0"
@@ -3,7 +3,7 @@
3
3
  import sys
4
4
  from pathlib import Path
5
5
 
6
- from parse_bench.data.download import default_data_dir, download_dataset, is_dataset_ready
6
+ from parse_bench.data.download import dataset_spec, default_data_dir, download_dataset, is_dataset_ready
7
7
 
8
8
 
9
9
  class DataCLI:
@@ -74,6 +74,20 @@ class DataCLI:
74
74
  print(f"Dataset: {data_path}")
75
75
  print()
76
76
 
77
+ subsets = dataset_spec(dataset).subsets
78
+ if subsets:
79
+ hdr = f"{'Subset':<26} {'Folder':<44} {'Test Cases':>10}"
80
+ print(hdr)
81
+ print("-" * len(hdr))
82
+ total = 0
83
+ for subset, folder in subsets:
84
+ n_cases = sum(1 for _ in (data_path / folder).rglob("*.test.json"))
85
+ total += n_cases
86
+ print(f"{subset:<26} {folder:<44} {n_cases:>10,}")
87
+ print("-" * len(hdr))
88
+ print(f"{'Total':<26} {'':<44} {total:>10,}")
89
+ return 0
90
+
77
91
  # Gather per-category stats from JSONL files
78
92
  jsonl_files = sorted(data_path.glob("*.jsonl"))
79
93
  total_cases = 0
@@ -1,9 +1,11 @@
1
1
  """Download parse-bench datasets from HuggingFace.
2
2
 
3
3
  Datasets (``--dataset``):
4
- parsebench https://huggingface.co/datasets/llamaindex/ParseBench (default)
5
- org/name any other HuggingFace dataset repo in the same layout: ``<category>.jsonl`` rows and ``docs/``,
6
- downloaded to ``./data/<name, lowercased>``
4
+ parsebench https://huggingface.co/datasets/llamaindex/ParseBench (default)
5
+ parsebench-2 https://huggingface.co/datasets/llamaindex/ParseBench-2, one folder per subset with a
6
+ ``<name>.test.json`` next to every page, downloaded to ``./data_parsebench-2``
7
+ org/name any other HuggingFace dataset repo in the same layout: ``<category>.jsonl`` rows and ``docs/``,
8
+ downloaded to ``./data/<name, lowercased>``
7
9
 
8
10
  Structure after download:
9
11
  <local_dir>/
@@ -30,6 +32,28 @@ TEST_DATA_REVISION = "test-data"
30
32
  # by an existing full download.
31
33
  DEFAULT_DATA_DIR = Path("./data")
32
34
  DEFAULT_TEST_DATA_DIR = Path("./data/test")
35
+ # Outside ./data: its sidecar test.json files would make the loader read ./data as a sidecar dataset.
36
+ PARSEBENCH2_DATA_DIR = Path("./data_parsebench-2")
37
+
38
+ # ParseBench 2 subsets (the ``evaluation run --next`` names); each one's cases are in the folder of the same name.
39
+ PARSEBENCH2_SUBSETS: dict[str, str] = {
40
+ name: name
41
+ for name in (
42
+ "text",
43
+ "headings",
44
+ "strikeout",
45
+ "underline",
46
+ "tables",
47
+ "complex_table_headers",
48
+ "financial_tables",
49
+ "insurance_filing_tables",
50
+ "dense_tables",
51
+ "charts",
52
+ "layout",
53
+ "forms",
54
+ "fillable_forms",
55
+ )
56
+ }
33
57
 
34
58
 
35
59
  @dataclass(frozen=True)
@@ -42,6 +66,8 @@ class DatasetSpec:
42
66
  doc_dirs: tuple[str, ...]
43
67
  test_data_dir: Path | None = None
44
68
  test_revision: str | None = None
69
+ # Sidecar datasets: (subset, folder) pairs; a complete copy has a test.json in every folder.
70
+ subsets: tuple[tuple[str, str], ...] = ()
45
71
 
46
72
 
47
73
  DATASETS: dict[str, DatasetSpec] = {
@@ -59,6 +85,13 @@ DATASETS: dict[str, DatasetSpec] = {
59
85
  test_data_dir=DEFAULT_TEST_DATA_DIR,
60
86
  test_revision=TEST_DATA_REVISION,
61
87
  ),
88
+ "parsebench-2": DatasetSpec(
89
+ repo="llamaindex/ParseBench-2",
90
+ data_dir=PARSEBENCH2_DATA_DIR,
91
+ required_files=(),
92
+ doc_dirs=(),
93
+ subsets=tuple(PARSEBENCH2_SUBSETS.items()),
94
+ ),
62
95
  }
63
96
 
64
97
  _REPO_ID = re.compile(r"[\w.-]+/[\w.-]+")
@@ -108,6 +141,9 @@ def is_dataset_ready(data_dir: Path, dataset: str = "parsebench") -> bool:
108
141
  if not data_dir.exists():
109
142
  return False
110
143
 
144
+ if spec.subsets:
145
+ return all(any((data_dir / folder).rglob("*.test.json")) for _, folder in spec.subsets)
146
+
111
147
  for f in spec.required_files:
112
148
  if not (data_dir / f).exists():
113
149
  return False
@@ -0,0 +1,37 @@
1
+ """Shared replacement semantics for keyed layout registrations."""
2
+
3
+ from collections.abc import Sequence
4
+ from typing import Protocol
5
+
6
+
7
+ class _KeyedRegistration(Protocol):
8
+ @property
9
+ def keys(self) -> tuple[str, ...]: ...
10
+
11
+
12
+ def updated_registrations[RegistrationT: _KeyedRegistration](
13
+ registrations: Sequence[RegistrationT],
14
+ replacement: RegistrationT,
15
+ *,
16
+ dangerous_override: bool,
17
+ ) -> Sequence[RegistrationT]:
18
+ """Replace at the first matched position, retaining unrelated tie order."""
19
+ requested = set(replacement.keys)
20
+ updated: list[RegistrationT] = []
21
+ inserted = False
22
+ for entry in registrations:
23
+ overlap = requested.intersection(entry.keys)
24
+ if len(overlap) == 0:
25
+ updated.append(entry)
26
+ continue
27
+ if not dangerous_override:
28
+ raise ValueError(f"Layout implementation already registered for keys {sorted(overlap)}")
29
+ omitted = set(entry.keys) - requested
30
+ if len(omitted) > 0:
31
+ raise ValueError(f"Override must include all aliases of the replaced registration: {sorted(omitted)}")
32
+ if not inserted:
33
+ updated.append(replacement)
34
+ inserted = True
35
+ if not inserted:
36
+ updated.append(replacement)
37
+ return updated