parse-bench 1.0.4__tar.gz → 1.0.7__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 (427) hide show
  1. {parse_bench-1.0.4 → parse_bench-1.0.7}/CHANGELOG.md +55 -0
  2. {parse_bench-1.0.4 → parse_bench-1.0.7}/PKG-INFO +33 -10
  3. {parse_bench-1.0.4 → parse_bench-1.0.7}/README.md +27 -9
  4. {parse_bench-1.0.4 → parse_bench-1.0.7}/pyproject.toml +7 -0
  5. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/__init__.py +1 -1
  6. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/cli.py +15 -2
  7. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/data/cli.py +14 -5
  8. parse_bench-1.0.7/src/parse_bench/data/download.py +179 -0
  9. parse_bench-1.0.7/src/parse_bench/data/repetition.py +118 -0
  10. parse_bench-1.0.7/src/parse_bench/evaluation/_registration.py +37 -0
  11. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/layoutdet.py +93 -146
  12. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/adapters.py +838 -233
  13. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/base.py +22 -4
  14. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/registry.py +30 -21
  15. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/mappers.py +116 -2
  16. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/projection.py +18 -6
  17. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/registry.py +12 -13
  18. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/core.py +49 -25
  19. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/geometry.py +22 -31
  20. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/classification_utils.py +111 -1
  21. parse_bench-1.0.7/src/parse_bench/evaluation/metrics/layoutdet/furniture.py +151 -0
  22. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/iou.py +31 -12
  23. parse_bench-1.0.7/src/parse_bench/evaluation/metrics/layoutdet/overlap.py +83 -0
  24. parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/chart_json_to_html.py +137 -0
  25. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rule_based_metric.py +33 -3
  26. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_base.py +70 -8
  27. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_diagram.py +4 -5
  28. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_form.py +99 -13
  29. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_formatting.py +135 -11
  30. parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/rules_repetition.py +222 -0
  31. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_extraction.py +21 -1
  32. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_record_match_metric.py +48 -76
  33. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_splitting.py +65 -41
  34. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/test_rules.py +1 -0
  35. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/test_types.py +1 -0
  36. parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/text_v21.py +281 -0
  37. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/utils.py +12 -12
  38. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/stats.py +1 -0
  39. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/extensions.py +17 -4
  40. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/layout_extraction.py +26 -14
  41. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/parse.py +514 -24
  42. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/__init__.py +6 -7
  43. parse_bench-1.0.7/src/parse_bench/inference/providers/extract/__init__.py +29 -0
  44. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/citations.py +3 -1
  45. parse_bench-1.0.7/src/parse_bench/inference/providers/layoutdet/__init__.py +33 -0
  46. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/adapters.py +1 -0
  47. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/__init__.py +30 -5
  48. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/_layout_utils.py +2 -0
  49. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/_unlimitedocr2_convert.py +386 -0
  50. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/aeddix_alpine_ocr_kdl.py +58 -0
  51. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/anthropic.py +57 -50
  52. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/anyformat.py +471 -0
  53. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/cohere_parse.py +511 -0
  54. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +358 -0
  55. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/deepseek.py +241 -0
  56. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/docai.py +412 -0
  57. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/hpd_parsing.py +560 -0
  58. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/hunyuanocr.py +738 -0
  59. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/jinaocr.py +310 -0
  60. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/lightonocr-3.py +472 -0
  61. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/llamaparse_v2_normalization.py +3 -0
  62. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/minicpm_ocr.py +243 -0
  63. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/nemotron_parse_3_5.py +246 -0
  64. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/nutrient_dws.py +664 -0
  65. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/openai.py +176 -12
  66. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/ovisocr2.py +357 -0
  67. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/ovisocr3.py +530 -0
  68. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/teleocr.py +402 -0
  69. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/unlimitedocr2.py +270 -0
  70. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/upstage.py +235 -0
  71. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/upstage_normalization.py +127 -0
  72. parse_bench-1.0.7/src/parse_bench/inference/providers/parse/wevisdoc.py +386 -0
  73. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/registry.py +26 -2
  74. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/layout_projection.py +21 -1
  75. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/pipeline/cli.py +6 -3
  76. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/extract_output.py +2 -2
  77. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/layout_detection_output.py +52 -0
  78. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/parse_output.py +14 -0
  79. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/loader.py +5 -5
  80. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/parse_rule_schemas.py +53 -11
  81. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/schema.py +3 -0
  82. parse_bench-1.0.7/tests/parse_bench/evaluation/evaluators/test_layoutdet_missing_ro_index.py +81 -0
  83. parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_anyformat_prediction_granularity.py +79 -0
  84. parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_registry.py +196 -0
  85. parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_retained_typed_writers.py +140 -0
  86. parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_rotated_attribution_adapters.py +595 -0
  87. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/attribution/test_attribution_overclaim.py +19 -0
  88. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/attribution/test_rotated_attribution.py +170 -0
  89. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_attributed_inline_tags.py +95 -0
  90. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_chart_json_to_html.py +10 -0
  91. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_diagram_rules.py +66 -1
  92. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_form_field_rule.py +43 -0
  93. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_latex_arrow_length.py +73 -0
  94. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_latex_script_order.py +49 -0
  95. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_mark_color_rule.py +87 -0
  96. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_presence_rule.py +119 -0
  97. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_repetition_overshoot_rule.py +129 -0
  98. parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_rule_alarm_thread_context.py +138 -0
  99. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_extraction.py +28 -0
  100. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_splitting.py +158 -0
  101. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_aeddix_alpine_ocr_kdl.py +71 -0
  102. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +136 -0
  103. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_anyformat.py +344 -0
  104. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_databricks_chart_descriptions.py +17 -0
  105. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_databricks_rest.py +49 -0
  106. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_docai.py +228 -0
  107. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_hpd_parsing.py +736 -0
  108. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_hunyuanocr.py +914 -0
  109. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_lightonocr_3.py +117 -0
  110. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_minicpm_ocr.py +69 -0
  111. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nemotron_parse_3_5.py +65 -0
  112. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nutrient_dws_errors.py +102 -0
  113. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nutrient_dws_markdown.py +106 -0
  114. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +269 -0
  115. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_ovisocr2.py +298 -0
  116. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_ovisocr3.py +77 -0
  117. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_teleocr.py +370 -0
  118. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_unlimitedocr2.py +70 -0
  119. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_upstage.py +475 -0
  120. parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_wevisdoc.py +387 -0
  121. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_layout_extraction.py +12 -0
  122. parse_bench-1.0.7/tests/parse_bench/inference/test_parse_pipelines.py +172 -0
  123. parse_bench-1.0.7/tests/parse_bench/test_cases/test_loader.py +91 -0
  124. parse_bench-1.0.7/tests/parse_bench/test_extensions.py +369 -0
  125. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_extract_integration.py +35 -0
  126. parse_bench-1.0.7/tests/test_repetition_cli.py +73 -0
  127. parse_bench-1.0.7/tests/test_text_v21.py +111 -0
  128. parse_bench-1.0.7/tests/test_text_v21_isolation.py +28 -0
  129. parse_bench-1.0.4/src/parse_bench/data/download.py +0 -127
  130. parse_bench-1.0.4/src/parse_bench/inference/providers/extract/__init__.py +0 -22
  131. parse_bench-1.0.4/src/parse_bench/inference/providers/layoutdet/__init__.py +0 -25
  132. parse_bench-1.0.4/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +0 -724
  133. parse_bench-1.0.4/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +0 -71
  134. parse_bench-1.0.4/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +0 -79
  135. parse_bench-1.0.4/tests/parse_bench/inference/test_parse_pipelines.py +0 -79
  136. parse_bench-1.0.4/tests/parse_bench/test_extensions.py +0 -149
  137. {parse_bench-1.0.4 → parse_bench-1.0.7}/.gitignore +0 -0
  138. {parse_bench-1.0.4 → parse_bench-1.0.7}/LICENSE +0 -0
  139. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/__init__.py +0 -0
  140. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/aggregation_report.py +0 -0
  141. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/cli.py +0 -0
  142. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison.py +0 -0
  143. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison_core.py +0 -0
  144. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison_report.py +0 -0
  145. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/detailed_report.py +0 -0
  146. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/leaderboard_report.py +0 -0
  147. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/metric_definitions.py +0 -0
  148. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/data/__init__.py +0 -0
  149. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/__init__.py +0 -0
  150. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/cli.py +0 -0
  151. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/__init__.py +0 -0
  152. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/base.py +0 -0
  153. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/extract.py +0 -0
  154. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/parse.py +0 -0
  155. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/qa.py +0 -0
  156. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/__init__.py +0 -0
  157. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/__init__.py +0 -0
  158. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/base.py +0 -0
  159. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metric_aggregation.py +0 -0
  160. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/__init__.py +0 -0
  161. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/__init__.py +0 -0
  162. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/constants.py +0 -0
  163. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/evaluate.py +0 -0
  164. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/text_utils.py +0 -0
  165. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/base.py +0 -0
  166. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/downstream/__init__.py +0 -0
  167. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/__init__.py +0 -0
  168. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/json_subset_match.py +0 -0
  169. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/json_subset_match_metric.py +0 -0
  170. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/list_unwrap.py +0 -0
  171. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/rule_based_metric.py +0 -0
  172. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/test_rules.py +0 -0
  173. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/test_types.py +0 -0
  174. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/__init__.py +0 -0
  175. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/core.py +0 -0
  176. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/extract_adapter.py +0 -0
  177. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/parse_adapter.py +0 -0
  178. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/rule_filters.py +0 -0
  179. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/value_compare.py +0 -0
  180. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/__init__.py +0 -0
  181. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/__init__.py +0 -0
  182. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/_vendor_grits_reference.py +0 -0
  183. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/cross_page_table_consistency.py +0 -0
  184. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/emphasis_spans.py +0 -0
  185. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/fast_tree_edit.py +0 -0
  186. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/grits_metric.py +0 -0
  187. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/grits_reference_metric.py +0 -0
  188. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/header_accuracy_metric.py +0 -0
  189. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/__init__.py +0 -0
  190. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/base.py +0 -0
  191. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/config.py +0 -0
  192. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/postprocess.py +0 -0
  193. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/strategy_judge.py +0 -0
  194. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/mermaid_graph.py +0 -0
  195. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rule_based_judge_metric.py +0 -0
  196. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_bag.py +0 -0
  197. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_chart.py +0 -0
  198. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_heading.py +0 -0
  199. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_list.py +0 -0
  200. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_page_decoration.py +0 -0
  201. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_table.py +0 -0
  202. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_text.py +0 -0
  203. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_watermark.py +0 -0
  204. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/structural_consistency_metric.py +0 -0
  205. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_merging.py +0 -0
  206. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_pairing.py +0 -0
  207. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_parsing.py +0 -0
  208. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_title_stripping.py +0 -0
  209. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/teds_metric.py +0 -0
  210. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/text_content_projection.py +0 -0
  211. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/text_similarity_metric.py +0 -0
  212. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/qa/__init__.py +0 -0
  213. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/qa/answer_comparison.py +0 -0
  214. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/qa/__init__.py +0 -0
  215. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/qa/llm_service.py +0 -0
  216. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/__init__.py +0 -0
  217. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/csv.py +0 -0
  218. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/html.py +0 -0
  219. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/markdown.py +0 -0
  220. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/rule_csv.py +0 -0
  221. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/runner.py +0 -0
  222. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/geometry/__init__.py +0 -0
  223. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/geometry/rotated_bbox.py +0 -0
  224. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/__init__.py +0 -0
  225. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/chunkr_layout_extraction.py +0 -0
  226. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/cli.py +0 -0
  227. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/__init__.py +0 -0
  228. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/extract.py +0 -0
  229. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/layout.py +0 -0
  230. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines.py +0 -0
  231. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/base.py +0 -0
  232. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/cancellation.py +0 -0
  233. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/extend.py +0 -0
  234. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/llamaextract_v2_api.py +0 -0
  235. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/base.py +0 -0
  236. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/chandra.py +0 -0
  237. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/docling.py +0 -0
  238. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/dots_ocr.py +0 -0
  239. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/layout_v3.py +0 -0
  240. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/layout_v3_byoc.py +0 -0
  241. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/paddle.py +0 -0
  242. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/qwen3vl.py +0 -0
  243. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/surya.py +0 -0
  244. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/yolo.py +0 -0
  245. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/_docling_common.py +0 -0
  246. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/amazon_nova.py +0 -0
  247. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/azure_document_intelligence.py +0 -0
  248. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/chandra2.py +0 -0
  249. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/chunkr.py +0 -0
  250. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/datalab.py +0 -0
  251. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/deepseekocr2.py +0 -0
  252. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/docling.py +0 -0
  253. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/docling_serve.py +0 -0
  254. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/dots_ocr.py +0 -0
  255. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/extend_parse.py +0 -0
  256. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/falconocr.py +0 -0
  257. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/florin_parser_nano.py +0 -0
  258. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/gemma4.py +0 -0
  259. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/glm_zai.py +0 -0
  260. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google.py +0 -0
  261. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_agentic_vision.py +0 -0
  262. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_docai.py +0 -0
  263. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_docai_layout_normalization.py +0 -0
  264. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/granite_vision.py +0 -0
  265. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/infinity_parser2.py +0 -0
  266. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/kdl_frontier_nano.py +0 -0
  267. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/landingai.py +0 -0
  268. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/liteparse.py +0 -0
  269. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/llamaparse.py +0 -0
  270. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/markitdown.py +0 -0
  271. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru25.py +0 -0
  272. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru2605pro.py +0 -0
  273. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru_diffusion.py +0 -0
  274. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mistral_ocr.py +0 -0
  275. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/nemotron_omni.py +0 -0
  276. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/oi_parser.py +0 -0
  277. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/opendataloader.py +0 -0
  278. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/paddleocr.py +0 -0
  279. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pdf_inspector.py +0 -0
  280. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pulse.py +0 -0
  281. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pymupdf.py +0 -0
  282. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pymupdf4llm.py +0 -0
  283. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pypdf.py +0 -0
  284. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/qwen.py +0 -0
  285. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/rakedoc_nano.py +0 -0
  286. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/reducto.py +0 -0
  287. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/surya2.py +0 -0
  288. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/tesseract.py +0 -0
  289. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/textract.py +0 -0
  290. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/unlimitedocr.py +0 -0
  291. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/unstructured.py +0 -0
  292. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/warp_ingest.py +0 -0
  293. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/renormalize.py +0 -0
  294. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/runner.py +0 -0
  295. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/layout_label_mapping.py +0 -0
  296. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/pipeline/__init__.py +0 -0
  297. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/py.typed +0 -0
  298. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/__init__.py +0 -0
  299. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/evaluation.py +0 -0
  300. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/layout_ontology.py +0 -0
  301. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/metrics.py +0 -0
  302. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/pipeline.py +0 -0
  303. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/pipeline_io.py +0 -0
  304. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/product.py +0 -0
  305. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/__init__.py +0 -0
  306. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/bbox_value_strict_comparator.py +0 -0
  307. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/extract_field_paths.py +0 -0
  308. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/layout_attribution_generation.py +0 -0
  309. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/rule_filters.py +0 -0
  310. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/rule_ids.py +0 -0
  311. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/__init__.py +0 -0
  312. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/gemini_layout_utils.py +0 -0
  313. {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/text_aggregation.py +0 -0
  314. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_consistency.py +0 -0
  315. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_core.py +0 -0
  316. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_directory_suffix.py +0 -0
  317. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_detailed_report.py +0 -0
  318. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_extract_empty_expected_output.py +0 -0
  319. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_layout_rule_filter.py +0 -0
  320. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_styling_rollup.py +0 -0
  321. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_table_pages.py +0 -0
  322. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_docling_parse_layout_adapter.py +0 -0
  323. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_attribution_scope.py +0 -0
  324. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_canonical_layout_pages.py +0 -0
  325. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_llamaparse_label_mapper.py +0 -0
  326. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_attributes.py +0 -0
  327. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_dual_read.py +0 -0
  328. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_pymupdf4llm_label_mapper.py +0 -0
  329. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/extract/test_json_subset_match.py +0 -0
  330. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/field_grounding/test_extract_adapter.py +0 -0
  331. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_average_precision.py +0 -0
  332. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_classification_utils_paging.py +0 -0
  333. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_rotated_iou.py +0 -0
  334. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_chart_data_point_rule.py +0 -0
  335. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_chart_label_punctuation.py +0 -0
  336. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_cross_page_table_consistency_metric.py +0 -0
  337. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_degenerate_marker_rules.py +0 -0
  338. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_fast_table_parity.py +0 -0
  339. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_formatting_rule_adjacent_spans.py +0 -0
  340. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_metric.py +0 -0
  341. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_perf_equivalence.py +0 -0
  342. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_trm_composite.py +0 -0
  343. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_header_accuracy_metric.py +0 -0
  344. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_heading_structure_rule.py +0 -0
  345. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_merge_preceding_titles.py +0 -0
  346. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_normalize_cell_text.py +0 -0
  347. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_normalize_text_inline_tag_separator.py +0 -0
  348. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_page_decoration_rule.py +0 -0
  349. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_combining_mark_tokenization.py +0 -0
  350. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_paragraph_spans.py +0 -0
  351. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_quotes.py +0 -0
  352. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_span_scope.py +0 -0
  353. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_list_level_rule.py +0 -0
  354. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_table_cell_augmentation.py +0 -0
  355. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_order_rule_html.py +0 -0
  356. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_relaxed_normalize_cell_text.py +0 -0
  357. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_budget_and_bag_images.py +0 -0
  358. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_side_inputs.py +0 -0
  359. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_caption_title_band.py +0 -0
  360. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_cell_inline_marker_separator.py +0 -0
  361. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_dot_leaders.py +0 -0
  362. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_marker_cells_rule.py +0 -0
  363. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_merging_metric.py +0 -0
  364. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_pairing.py +0 -0
  365. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_record_match_metric.py +0 -0
  366. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_row_header_th.py +0 -0
  367. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_tbody_provenance.py +0 -0
  368. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_title_stripping.py +0 -0
  369. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_teds_metric.py +0 -0
  370. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_color_rule.py +0 -0
  371. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_content_projection.py +0 -0
  372. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_similarity_metric.py +0 -0
  373. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_title_hierarchy_inapplicable.py +0 -0
  374. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_watermark_removal_rule.py +0 -0
  375. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/qa/test_answer_comparison_exact_choice.py +0 -0
  376. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_cli_detailed_report_nonfatal.py +0 -0
  377. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_aggregation.py +0 -0
  378. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_result_files.py +0 -0
  379. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_worker_timeout.py +0 -0
  380. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_stats.py +0 -0
  381. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/geometry/test_rotated_bbox.py +0 -0
  382. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/extract/test_extend_cost_stats.py +0 -0
  383. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/extract/test_extend_schema_adapter.py +0 -0
  384. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_amazon_nova.py +0 -0
  385. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_azure_document_intelligence_layout.py +0 -0
  386. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_chandra2_multipage.py +0 -0
  387. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_datalab.py +0 -0
  388. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_deepseekocr2_multipage.py +0 -0
  389. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_extend_parse_pages.py +0 -0
  390. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_falconocr_multipage.py +0 -0
  391. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_gemma4_multipage.py +0 -0
  392. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_glm_zai.py +0 -0
  393. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_google_parse_pricing.py +0 -0
  394. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_granite_vision_multipage.py +0 -0
  395. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_infinity_parser2.py +0 -0
  396. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_kdl_frontier_nano.py +0 -0
  397. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_layout_coordinate_frames.py +0 -0
  398. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_layout_utils.py +0 -0
  399. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_liteparse_layout.py +0 -0
  400. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_picture_type.py +0 -0
  401. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_polling.py +0 -0
  402. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_usage_metadata.py +0 -0
  403. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_normalization.py +0 -0
  404. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_null_page_fields.py +0 -0
  405. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru25_multipage.py +0 -0
  406. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru2605pro_multipage.py +0 -0
  407. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru_diffusion_multipage.py +0 -0
  408. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_nemotron_omni_multipage.py +0 -0
  409. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_paddleocr_multipage.py +0 -0
  410. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_pymupdf4llm.py +0 -0
  411. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_qwen.py +0 -0
  412. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_reducto_normalize.py +0 -0
  413. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_surya2_multipage.py +0 -0
  414. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_textract_cost.py +0 -0
  415. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_unlimitedocr_multipage.py +0 -0
  416. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_warp_ingest.py +0 -0
  417. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_cli.py +0 -0
  418. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_renormalize.py +0 -0
  419. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_runner.py +0 -0
  420. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_loader_stem_twins.py +0 -0
  421. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_parse_rule_schemas.py +0 -0
  422. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_rule_ids.py +0 -0
  423. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_evaluation_schema_extra_fields.py +0 -0
  424. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_layout_label_mapping_code_alias.py +0 -0
  425. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_data_dir_routing.py +0 -0
  426. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_llamaparse_base_url.py +0 -0
  427. {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_pulse_public_api.py +0 -0
@@ -13,11 +13,66 @@ All notable changes to `parse-bench` are recorded here. The format follows
13
13
 
14
14
  ## [Unreleased]
15
15
 
16
+ ### Added
17
+ - `repetition_overshoot`, a built-in rule that fails an output repeating anything (a leader, a unit, a token, a line,
18
+ a table row, a whole table) more than the page holds. `parse-bench repetition make <dir>` writes this test next to
19
+ each of your own PDFs, budgeted from its text layer. See `docs/repetition-overshoot.md`.
20
+ - `--dataset` on `download`, `status` and `run` accepts any HuggingFace dataset repo id (`org/name`) in the ParseBench
21
+ 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
+ - `ovisocr3_vllm` pipeline and `ovisocr3` provider for OvisOCR3
38
+ (`OVISOCR3_SERVER_URL`). Sends the official structured-parsing prompt, re-reads
39
+ each chart region with the official chart-parsing prompt, and scores layout
40
+ through `LayoutDetectionModel.OVISOCR3_LAYOUT`.
41
+ - `unlimitedocr2` pipeline and provider for Unlimited-OCR 2
42
+ (`UNLIMITEDOCR2_SERVER_URL`). Converts the model's layout-block output with
43
+ Baidu's official converter (vendored) and scores layout through
44
+ `LayoutDetectionModel.UNLIMITED_OCR_2_LAYOUT`.
45
+ - `nemotron_parse_3_5_sdk` pipeline and `nemotron_parse_3_5` provider for
46
+ Nemotron 3.5 Parse, driven by an SDK server that runs the model repository's
47
+ triple-pass pipeline (`NEMOTRON_PARSE_3_5_SERVER_URL`). Its layout adapter
48
+ keeps the Canonical17 label strings under the new
49
+ `LayoutDetectionModel.NEMOTRON_PARSE_LAYOUT` (with a `LAYOUT_MODEL_INFO`
50
+ entry), and a passthrough label mapper resolves them, so Visual Grounding is
51
+ scored instead of raising `UnknownRawLayoutLabelError`.
52
+ - `minicpm_ocr_sdk` pipeline and `minicpm_ocr` provider for MiniCPM-OCR 1.0,
53
+ driven by a server running the official `minicpmvocr` SDK
54
+ (`MINICPM_OCR_SERVER_URL`). PP-DocLayoutV3 regions are mapped to canonical
55
+ labels and scored for Visual Grounding under the new
56
+ `LayoutDetectionModel.MINICPM_OCR_LAYOUT` (with a `LAYOUT_MODEL_INFO` entry).
57
+ - `register_reference_thumbnailer` (exported from `parse_bench.extensions`):
58
+ how a rule's `reference_image` is rendered into the detailed report. parse-bench
59
+ keeps no image stack in its core dependencies, so it ships no default and
60
+ simply omits the inline crop; a harness that already depends on one can
61
+ register its renderer to get crops back. A thumbnailer that raises costs the
62
+ report its crop, never the rule its score.
63
+
16
64
  ### Changed
17
65
  - Dropped the `scikit-learn` dependency. Layout-detection average precision is
18
66
  now computed with a small numpy implementation that matches
19
67
  `sklearn.metrics.average_precision_score` (including tied-score handling),
20
68
  so evaluation numbers are unchanged. `scipy` remains a core dependency.
69
+ - Built-in providers now register on the first `create_provider` call instead
70
+ of when `parse_bench.inference.providers` (or any module under it) is
71
+ imported. Importing `parse_bench.extensions` or the layout adapter and label
72
+ mapper registries no longer loads every provider and its SDK: about 0.4 s
73
+ instead of about 4.8 s in a full install. The provider subpackages expose
74
+ `load_providers()` and the registry `load_builtin_providers()`; code that
75
+ read `_PROVIDER_REGISTRY` directly should call the latter first.
21
76
 
22
77
  ## [1.0.2] - 2026-09-04
23
78
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parse-bench
3
- Version: 1.0.4
3
+ Version: 1.0.7
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
@@ -50,6 +50,8 @@ Requires-Dist: anthropic>=0.77.1; extra == 'anthropic'
50
50
  Requires-Dist: pdf2image>=1.16.0; extra == 'anthropic'
51
51
  Requires-Dist: pillow>=10.0.0; extra == 'anthropic'
52
52
  Requires-Dist: pymupdf>=1.24.0; extra == 'anthropic'
53
+ Provides-Extra: anyformat
54
+ Requires-Dist: httpx>=0.28.0; extra == 'anyformat'
53
55
  Provides-Extra: aws
54
56
  Requires-Dist: amazon-textract-textractor>=1.7.0; extra == 'aws'
55
57
  Requires-Dist: boto3>=1.34.0; extra == 'aws'
@@ -126,6 +128,9 @@ Requires-Dist: unstructured-client>=0.26.0; extra == 'runners'
126
128
  Requires-Dist: warp-ingest[ocr]>=2.0.1; extra == 'runners'
127
129
  Provides-Extra: unstructured
128
130
  Requires-Dist: unstructured-client>=0.26.0; extra == 'unstructured'
131
+ Provides-Extra: upstage
132
+ Requires-Dist: httpx>=0.28.0; extra == 'upstage'
133
+ Requires-Dist: pillow>=10.0.0; extra == 'upstage'
129
134
  Description-Content-Type: text/markdown
130
135
 
131
136
  # ParseBench
@@ -133,6 +138,7 @@ Description-Content-Type: text/markdown
133
138
  [![Website](https://img.shields.io/badge/Website-parsebench.ai-blue)](https://parsebench.ai)
134
139
  [![arXiv](https://img.shields.io/badge/arXiv-2604.08538-b31b1b.svg)](https://arxiv.org/abs/2604.08538)
135
140
  [![Dataset](https://img.shields.io/badge/HuggingFace-Dataset-yellow)](https://huggingface.co/datasets/llamaindex/ParseBench)
141
+ [![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)
136
142
  [![License](https://img.shields.io/badge/License-Apache_2.0-green.svg)](LICENSE)
137
143
 
138
144
  > **Related:** For schema-guided enterprise document extraction, see our companion benchmark [ExtractBench](https://github.com/run-llama/ExtractBench).
@@ -152,16 +158,16 @@ _Top 10 by Overall score. For the full sortable, filterable leaderboard, see [pa
152
158
 
153
159
  | Rank | Provider | Category | Overall | Tables | Charts | Content Faith. | Sem. Format. | Visual Ground. | ¢ / Page |
154
160
  |---:|---|---|---:|---:|---:|---:|---:|---:|---:|
155
- | 1 | LlamaParse Agentic Plus | LlamaParse | 90.20 | 93.37 | 94.18 | 92.25 | 87.12 | 84.09 | 5.62¢ |
156
- | 2 | LlamaParse Agentic | LlamaParse | 87.01 | 88.88 | 88.68 | 91.78 | 81.44 | 84.25 | 1.25¢ |
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¢ |
157
163
  | 3 | Pulse Ultra 2 | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
158
- | 4 | LlamaParse Cost Effective | LlamaParse | 80.61 | 84.19 | 77.91 | 89.87 | 67.29 | 83.77 | 0.38¢ |
159
- | 5 | Anthropic Fable 5.1 | VLM - Proprietary | 78.92 | 91.52 | 67.06 | 91.19 | 76.52 | 68.3 | 16.05¢ |
160
- | 6 | oi-parser | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
161
- | 7 | rakedoc-nano | VLM - Open Weight | 77.23 | 86.44 | 64.89 | 88.84 | 71.68 | 74.28 | — |
162
- | 8 | florin-parser-nano | VLM - Open Weight | 76.69 | 86.10 | 65.19 | 87.37 | 70.64 | 74.14 | — |
163
- | 9 | KDL-Frontier-Parser-nano | VLM - Open Weight | 76.36 | 85.56 | 63.41 | 87.19 | 66.81 | 78.84 | — |
164
- | 10 | Extend (2.0) | Commercial - Startup APIs | 75.33 | 84.82 | 78.31 | 84.59 | 60.31 | 68.61 | 2.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 | — |
165
171
  <!-- LEADERBOARD:END -->
166
172
 
167
173
  **Inclusion criteria:**
@@ -267,6 +273,23 @@ uv run parse-bench download --test
267
273
  uv run parse-bench status
268
274
  ```
269
275
 
276
+ ### Repetition tests
277
+
278
+ `repetition_overshoot` is a built-in rule that fails an output repeating anything (a dot leader, a unit, a token, a
279
+ line, a table row, a whole table) more than the page holds. Restyling, splitting, merging or dropping a repetition
280
+ never fails; only overshoot does. An empty answer fails too.
281
+
282
+ ```bash
283
+ # Write a repetition test next to each PDF, budgeted from its text layer, then run it
284
+ uv run parse-bench repetition make ./my_docs
285
+ uv run parse-bench run <pipeline_name> --input_dir ./my_docs
286
+
287
+ # Run any HuggingFace dataset in the ParseBench layout (downloads to ./data/<name> on first run)
288
+ uv run parse-bench run <pipeline_name> --dataset org/name
289
+ ```
290
+
291
+ See [docs/repetition-overshoot.md](docs/repetition-overshoot.md) for the rule and its budgets.
292
+
270
293
  ## Usage
271
294
 
272
295
  ### Running the Benchmark
@@ -3,6 +3,7 @@
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
+ [![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)
6
7
  [![License](https://img.shields.io/badge/License-Apache_2.0-green.svg)](LICENSE)
7
8
 
8
9
  > **Related:** For schema-guided enterprise document extraction, see our companion benchmark [ExtractBench](https://github.com/run-llama/ExtractBench).
@@ -22,16 +23,16 @@ _Top 10 by Overall score. For the full sortable, filterable leaderboard, see [pa
22
23
 
23
24
  | Rank | Provider | Category | Overall | Tables | Charts | Content Faith. | Sem. Format. | Visual Ground. | ¢ / Page |
24
25
  |---:|---|---|---:|---:|---:|---:|---:|---:|---:|
25
- | 1 | LlamaParse Agentic Plus | LlamaParse | 90.20 | 93.37 | 94.18 | 92.25 | 87.12 | 84.09 | 5.62¢ |
26
- | 2 | LlamaParse Agentic | LlamaParse | 87.01 | 88.88 | 88.68 | 91.78 | 81.44 | 84.25 | 1.25¢ |
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¢ |
27
28
  | 3 | Pulse Ultra 2 | Commercial - Startup APIs | 81.60 | 90.35 | 89.70 | 87.63 | 73.97 | 66.35 | 1.50¢ |
28
- | 4 | LlamaParse Cost Effective | LlamaParse | 80.61 | 84.19 | 77.91 | 89.87 | 67.29 | 83.77 | 0.38¢ |
29
- | 5 | Anthropic Fable 5.1 | VLM - Proprietary | 78.92 | 91.52 | 67.06 | 91.19 | 76.52 | 68.3 | 16.05¢ |
30
- | 6 | oi-parser | Commercial - Startup APIs | 78.30 | 92.62 | 78.28 | 86.17 | 66.88 | 67.53 | — |
31
- | 7 | rakedoc-nano | VLM - Open Weight | 77.23 | 86.44 | 64.89 | 88.84 | 71.68 | 74.28 | — |
32
- | 8 | florin-parser-nano | VLM - Open Weight | 76.69 | 86.10 | 65.19 | 87.37 | 70.64 | 74.14 | — |
33
- | 9 | KDL-Frontier-Parser-nano | VLM - Open Weight | 76.36 | 85.56 | 63.41 | 87.19 | 66.81 | 78.84 | — |
34
- | 10 | Extend (2.0) | Commercial - Startup APIs | 75.33 | 84.82 | 78.31 | 84.59 | 60.31 | 68.61 | 2.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 | — |
35
36
  <!-- LEADERBOARD:END -->
36
37
 
37
38
  **Inclusion criteria:**
@@ -137,6 +138,23 @@ uv run parse-bench download --test
137
138
  uv run parse-bench status
138
139
  ```
139
140
 
141
+ ### Repetition tests
142
+
143
+ `repetition_overshoot` is a built-in rule that fails an output repeating anything (a dot leader, a unit, a token, a
144
+ line, a table row, a whole table) more than the page holds. Restyling, splitting, merging or dropping a repetition
145
+ never fails; only overshoot does. An empty answer fails too.
146
+
147
+ ```bash
148
+ # Write a repetition test next to each PDF, budgeted from its text layer, then run it
149
+ uv run parse-bench repetition make ./my_docs
150
+ uv run parse-bench run <pipeline_name> --input_dir ./my_docs
151
+
152
+ # Run any HuggingFace dataset in the ParseBench layout (downloads to ./data/<name> on first run)
153
+ uv run parse-bench run <pipeline_name> --dataset org/name
154
+ ```
155
+
156
+ See [docs/repetition-overshoot.md](docs/repetition-overshoot.md) for the rule and its budgets.
157
+
140
158
  ## Usage
141
159
 
142
160
  ### Running the Benchmark
@@ -48,6 +48,7 @@ dependencies = [
48
48
  ]
49
49
 
50
50
  [project.optional-dependencies]
51
+ upstage = ["httpx>=0.28.0", "pillow>=10.0.0"]
51
52
  runners = [
52
53
  "anthropic>=0.77.1",
53
54
  "azure-ai-documentintelligence>=1.0.0",
@@ -87,6 +88,7 @@ unstructured = ["unstructured-client>=0.26.0"]
87
88
  chunkr = ["chunkr-ai>=0.0.43"]
88
89
  extend = ["extend-ai>=1.16.0"]
89
90
  docling = ["docling-core>=2.71.0", "httpx>=0.28.0"]
91
+ anyformat = ["httpx>=0.28.0"]
90
92
  local = ["pymupdf>=1.24.0", "pypdf>=6.4.0", "pytesseract>=0.3.10", "pdf2image>=1.16.0", "pillow>=10.0.0"]
91
93
  liteparse = ["liteparse>=2.14.3"]
92
94
  pymupdf4llm = [
@@ -221,6 +223,11 @@ ignore_errors = true
221
223
  module = "parse_bench.test_cases.parse_rule_schemas"
222
224
  ignore_errors = true
223
225
 
226
+ # Vendored verbatim from github.com/baidu/Unlimited-OCR (raw block output -> markdown).
227
+ [[tool.mypy.overrides]]
228
+ module = "parse_bench.inference.providers.parse._unlimitedocr2_convert"
229
+ ignore_errors = true
230
+
224
231
  [tool.pytest.ini_options]
225
232
  testpaths = ["tests"]
226
233
  python_files = ["test_*.py"]
@@ -1,3 +1,3 @@
1
1
  """Document parsing evaluation system for competitive benchmarking."""
2
2
 
3
- __version__ = "1.0.4"
3
+ __version__ = "1.0.7"
@@ -9,6 +9,7 @@ from dotenv import find_dotenv, load_dotenv
9
9
  from parse_bench import __version__
10
10
  from parse_bench.analysis.cli import AnalysisCLI
11
11
  from parse_bench.data.cli import DataCLI
12
+ from parse_bench.data.repetition import RepetitionCLI
12
13
  from parse_bench.evaluation.cli import EvaluationCLI
13
14
  from parse_bench.inference.cli import InferenceCLI
14
15
  from parse_bench.pipeline.cli import PipelineCLI
@@ -56,6 +57,7 @@ class BenchCLI:
56
57
  analysis Generate reports, dashboards, comparisons
57
58
  pipeline End-to-end pipeline (same as 'run')
58
59
  data Dataset management (same as 'download'/'status')
60
+ repetition Repetition tests for your own PDFs ('parse-bench repetition make <dir>')
59
61
  """
60
62
 
61
63
  def __init__(self) -> None:
@@ -64,6 +66,7 @@ class BenchCLI:
64
66
  self.analysis = AnalysisCLI()
65
67
  self.pipeline = PipelineCLI()
66
68
  self.data = DataCLI()
69
+ self.repetition = RepetitionCLI()
67
70
 
68
71
  # ── Top-level convenience commands ──────────────────────────────
69
72
 
@@ -85,6 +88,7 @@ class BenchCLI:
85
88
  open_report: bool = True,
86
89
  skip_inference: bool = False,
87
90
  test: bool = False,
91
+ dataset: str = "parsebench",
88
92
  ) -> int:
89
93
  """Run end-to-end benchmark: inference -> evaluation -> report.
90
94
 
@@ -101,9 +105,11 @@ class BenchCLI:
101
105
  open_report: Open HTML report in browser (default: True)
102
106
  skip_inference: Skip inference, only re-evaluate (default: False)
103
107
  test: Download and run on the small test dataset (3 files per category)
108
+ dataset: Which dataset: 'parsebench' (default) or a HuggingFace repo id (org/name) in the same layout
104
109
 
105
110
  Example:
106
111
  parse-bench run llamaparse_agentic
112
+ parse-bench run llamaparse_agentic --dataset acme/MyBench
107
113
  parse-bench run llamaparse_agentic --group chart
108
114
  parse-bench run llamaparse_agentic --skip_inference
109
115
  parse-bench run llamaparse_agentic --test
@@ -121,6 +127,7 @@ class BenchCLI:
121
127
  open_report=open_report,
122
128
  skip_inference=skip_inference,
123
129
  test=test,
130
+ dataset=dataset,
124
131
  )
125
132
 
126
133
  def download(
@@ -128,6 +135,7 @@ class BenchCLI:
128
135
  data_dir: str | Path | None = None,
129
136
  force: bool = False,
130
137
  test: bool = False,
138
+ dataset: str = "parsebench",
131
139
  ) -> int:
132
140
  """Download the benchmark dataset from HuggingFace.
133
141
 
@@ -135,17 +143,20 @@ class BenchCLI:
135
143
  data_dir: Directory to store dataset (default: ./data)
136
144
  force: Force re-download even if data exists
137
145
  test: Download the small test dataset (3 files per category)
146
+ dataset: Which dataset: 'parsebench' (default) or a HuggingFace repo id (org/name) in the same layout
138
147
 
139
148
  Example:
140
149
  parse-bench download
141
150
  parse-bench download --test
151
+ parse-bench download --dataset acme/MyBench
142
152
  """
143
- return self.data.download(data_dir=data_dir, force=force, test=test)
153
+ return self.data.download(data_dir=data_dir, force=force, test=test, dataset=dataset)
144
154
 
145
155
  def status(
146
156
  self,
147
157
  data_dir: str | Path | None = None,
148
158
  test: bool = False,
159
+ dataset: str = "parsebench",
149
160
  ) -> int:
150
161
  """Check if the benchmark dataset is downloaded and ready.
151
162
 
@@ -153,13 +164,15 @@ class BenchCLI:
153
164
  data_dir: Data directory to check
154
165
  (default: ./data, or ./data/test when --test is set)
155
166
  test: Check the small test dataset instead of the full dataset
167
+ dataset: Which dataset: 'parsebench' (default) or a HuggingFace repo id (org/name) in the same layout
156
168
 
157
169
  Example:
158
170
  parse-bench status
159
171
  parse-bench status --test
172
+ parse-bench status --dataset acme/MyBench
160
173
  parse-bench status data/
161
174
  """
162
- return self.data.status(data_dir=data_dir, test=test)
175
+ return self.data.status(data_dir=data_dir, test=test, dataset=dataset)
163
176
 
164
177
  def pipelines(self) -> None:
165
178
  """List all available pipeline configurations."""
@@ -14,6 +14,7 @@ class DataCLI:
14
14
  data_dir: str | Path | None = None,
15
15
  force: bool = False,
16
16
  test: bool = False,
17
+ dataset: str = "parsebench",
17
18
  ) -> int:
18
19
  """Download the parse-bench dataset from HuggingFace.
19
20
 
@@ -22,13 +23,14 @@ class DataCLI:
22
23
  (default: ./data, or ./data/test when --test is set)
23
24
  force: Force re-download even if data already exists
24
25
  test: Download the small test dataset (3 files per category)
26
+ dataset: Which dataset: 'parsebench' (default) or a HuggingFace repo id (org/name) in the same layout
25
27
 
26
28
  Returns:
27
29
  Exit code (0 for success, non-zero for failure)
28
30
  """
29
31
  try:
30
- data_path = Path(data_dir) if data_dir else default_data_dir(test=test)
31
- download_dataset(data_dir=data_path, force=force, test=test)
32
+ data_path = Path(data_dir) if data_dir else default_data_dir(test=test, dataset=dataset)
33
+ download_dataset(data_dir=data_path, force=force, test=test, dataset=dataset)
32
34
  return 0
33
35
  except Exception as e:
34
36
  print(f"Error downloading dataset: {e}", file=sys.stderr)
@@ -41,6 +43,7 @@ class DataCLI:
41
43
  self,
42
44
  data_dir: str | Path | None = None,
43
45
  test: bool = False,
46
+ dataset: str = "parsebench",
44
47
  ) -> int:
45
48
  """Check if the dataset is downloaded and show summary statistics.
46
49
 
@@ -48,18 +51,24 @@ class DataCLI:
48
51
  data_dir: Data directory to check
49
52
  (default: ./data, or ./data/test when --test is set)
50
53
  test: Check the small test dataset instead of the full dataset
54
+ dataset: Which dataset: 'parsebench' (default) or a HuggingFace repo id (org/name) in the same layout
51
55
 
52
56
  Returns:
53
57
  Exit code (0 if ready, 1 if not)
54
58
  """
55
59
  import json
56
60
 
57
- data_path = Path(data_dir) if data_dir else Path.cwd() / default_data_dir(test=test)
58
- ready = is_dataset_ready(data_path)
61
+ try:
62
+ data_path = Path(data_dir) if data_dir else Path.cwd() / default_data_dir(test=test, dataset=dataset)
63
+ ready = is_dataset_ready(data_path, dataset)
64
+ except ValueError as e:
65
+ print(f"Error: {e}", file=sys.stderr)
66
+ return 1
59
67
 
60
68
  if not ready:
61
69
  print(f"Dataset is NOT ready at: {data_path}")
62
- print("Run 'parse-bench download' to download it.")
70
+ flag = "" if dataset == "parsebench" else f" --dataset {dataset}"
71
+ print(f"Run 'parse-bench download{flag}' to download it.")
63
72
  return 1
64
73
 
65
74
  print(f"Dataset: {data_path}")
@@ -0,0 +1,179 @@
1
+ """Download parse-bench datasets from HuggingFace.
2
+
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>``
7
+
8
+ Structure after download:
9
+ <local_dir>/
10
+ ├── chart.jsonl
11
+ ├── layout.jsonl
12
+ ├── table.jsonl
13
+ ├── text.jsonl
14
+ ├── expected_markdown.json
15
+ └── pdfs/{chart,layout,table,text}/*.pdf
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import re
21
+ from dataclasses import dataclass
22
+ from pathlib import Path
23
+
24
+ DATASET_REPO = "llamaindex/ParseBench"
25
+ DATASET_REPO_TYPE = "dataset"
26
+ TEST_DATA_REVISION = "test-data"
27
+
28
+ # Default on-disk locations. Test data lives in a sibling subdirectory so the
29
+ # two datasets coexist and `--test` does not silently overlay or get masked
30
+ # by an existing full download.
31
+ DEFAULT_DATA_DIR = Path("./data")
32
+ DEFAULT_TEST_DATA_DIR = Path("./data/test")
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class DatasetSpec:
37
+ """A dataset the CLI can download: where it lives on HuggingFace and on disk, and what a complete copy holds."""
38
+
39
+ repo: str
40
+ data_dir: Path
41
+ required_files: tuple[str, ...]
42
+ doc_dirs: tuple[str, ...]
43
+ test_data_dir: Path | None = None
44
+ test_revision: str | None = None
45
+
46
+
47
+ DATASETS: dict[str, DatasetSpec] = {
48
+ "parsebench": DatasetSpec(
49
+ repo=DATASET_REPO,
50
+ data_dir=DEFAULT_DATA_DIR,
51
+ required_files=(
52
+ "chart.jsonl",
53
+ "layout.jsonl",
54
+ "table.jsonl",
55
+ "text_content.jsonl",
56
+ "text_formatting.jsonl",
57
+ ),
58
+ doc_dirs=("docs/chart", "docs/layout", "docs/table", "docs/text"),
59
+ test_data_dir=DEFAULT_TEST_DATA_DIR,
60
+ test_revision=TEST_DATA_REVISION,
61
+ ),
62
+ }
63
+
64
+ _REPO_ID = re.compile(r"[\w.-]+/[\w.-]+")
65
+
66
+
67
+ def dataset_spec(dataset: str = "parsebench", test: bool = False) -> DatasetSpec:
68
+ """Look up a dataset by name or HuggingFace repo id; ``test`` requires one that has a test subset.
69
+
70
+ A repo id (``org/name``) not in ``DATASETS`` is any dataset in the ParseBench layout. Its categories are not
71
+ known in advance, so a complete copy is one with at least one ``*.jsonl`` and a non-empty ``docs/``.
72
+ """
73
+ if dataset in DATASETS:
74
+ spec = DATASETS[dataset]
75
+ elif _REPO_ID.fullmatch(dataset):
76
+ name = dataset.split("/", 1)[1].lower()
77
+ spec = DatasetSpec(repo=dataset, data_dir=DEFAULT_DATA_DIR / name, required_files=(), doc_dirs=("docs",))
78
+ else:
79
+ raise ValueError(
80
+ f"Unknown dataset {dataset!r}; choose one of: {', '.join(DATASETS)}, or a HuggingFace repo id (org/name)"
81
+ )
82
+ if test and spec.test_data_dir is None:
83
+ raise ValueError(f"The {dataset!r} dataset has no test subset; drop --test")
84
+ return spec
85
+
86
+
87
+ def default_data_dir(test: bool = False, dataset: str = "parsebench") -> Path:
88
+ """Return the default on-disk dataset path for the given mode.
89
+
90
+ Used by every CLI surface that takes ``--test`` so the routing is
91
+ consistent between ``download``, ``run`` and ``status``.
92
+ """
93
+ spec = dataset_spec(dataset, test)
94
+ return spec.test_data_dir if test and spec.test_data_dir else spec.data_dir
95
+
96
+
97
+ def is_dataset_ready(data_dir: Path, dataset: str = "parsebench") -> bool:
98
+ """Check if the dataset is already downloaded and complete.
99
+
100
+ Args:
101
+ data_dir: Path to the data directory.
102
+ dataset: Which dataset to check for (see ``dataset_spec``).
103
+
104
+ Returns:
105
+ True if all required files and at least one PDF per category exist.
106
+ """
107
+ spec = dataset_spec(dataset)
108
+ if not data_dir.exists():
109
+ return False
110
+
111
+ for f in spec.required_files:
112
+ if not (data_dir / f).exists():
113
+ return False
114
+ if not spec.required_files and not any(data_dir.glob("*.jsonl")):
115
+ return False
116
+
117
+ for d in spec.doc_dirs:
118
+ doc_dir = data_dir / d
119
+ if not doc_dir.exists():
120
+ return False
121
+ # Check for any supported document file (PDF, image, etc.)
122
+ if not any(doc_dir.rglob("*.*")):
123
+ return False
124
+
125
+ return True
126
+
127
+
128
+ def download_dataset(
129
+ data_dir: Path | None = None,
130
+ force: bool = False,
131
+ test: bool = False,
132
+ dataset: str = "parsebench",
133
+ ) -> Path:
134
+ """Download a parse-bench dataset from HuggingFace.
135
+
136
+ Uses huggingface_hub's snapshot_download to fetch the full dataset,
137
+ including JSONL files and PDFs.
138
+
139
+ Args:
140
+ data_dir: Local directory to store the dataset.
141
+ Defaults to ./data in the current working directory.
142
+ force: Force re-download even if data already exists.
143
+ test: Download the small test dataset (3 files per category)
144
+ instead of the full dataset.
145
+ dataset: Which dataset to download: a name in ``DATASETS`` or a HuggingFace repo id.
146
+
147
+ Returns:
148
+ Path to the downloaded dataset directory.
149
+ """
150
+ from huggingface_hub import snapshot_download
151
+
152
+ spec = dataset_spec(dataset, test)
153
+ if data_dir is None:
154
+ data_dir = Path.cwd() / default_data_dir(test=test, dataset=dataset)
155
+
156
+ revision = spec.test_revision if test else None
157
+
158
+ if not force and is_dataset_ready(data_dir, dataset):
159
+ print(f"Dataset already downloaded at: {data_dir}")
160
+ return data_dir
161
+
162
+ label = "test dataset" if test else "dataset"
163
+ print(f"Downloading {label} from HuggingFace: {spec.repo}")
164
+ if revision:
165
+ print(f"Branch: {revision}")
166
+ print(f"Destination: {data_dir}")
167
+
168
+ snapshot_download(
169
+ repo_id=spec.repo,
170
+ repo_type=DATASET_REPO_TYPE,
171
+ local_dir=str(data_dir),
172
+ revision=revision,
173
+ )
174
+
175
+ if not is_dataset_ready(data_dir, dataset):
176
+ raise RuntimeError(f"Dataset download completed but validation failed. Check {data_dir} for missing files.")
177
+
178
+ print(f"Dataset ready at: {data_dir}")
179
+ return data_dir