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.
- {parse_bench-1.0.4 → parse_bench-1.0.7}/CHANGELOG.md +55 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/PKG-INFO +33 -10
- {parse_bench-1.0.4 → parse_bench-1.0.7}/README.md +27 -9
- {parse_bench-1.0.4 → parse_bench-1.0.7}/pyproject.toml +7 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/__init__.py +1 -1
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/cli.py +15 -2
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/data/cli.py +14 -5
- parse_bench-1.0.7/src/parse_bench/data/download.py +179 -0
- parse_bench-1.0.7/src/parse_bench/data/repetition.py +118 -0
- parse_bench-1.0.7/src/parse_bench/evaluation/_registration.py +37 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/layoutdet.py +93 -146
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/adapters.py +838 -233
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/base.py +22 -4
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/registry.py +30 -21
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/mappers.py +116 -2
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/projection.py +18 -6
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/registry.py +12 -13
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/core.py +49 -25
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/geometry.py +22 -31
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/classification_utils.py +111 -1
- parse_bench-1.0.7/src/parse_bench/evaluation/metrics/layoutdet/furniture.py +151 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/iou.py +31 -12
- parse_bench-1.0.7/src/parse_bench/evaluation/metrics/layoutdet/overlap.py +83 -0
- parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/chart_json_to_html.py +137 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rule_based_metric.py +33 -3
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_base.py +70 -8
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_diagram.py +4 -5
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_form.py +99 -13
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_formatting.py +135 -11
- parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/rules_repetition.py +222 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_extraction.py +21 -1
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_record_match_metric.py +48 -76
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_splitting.py +65 -41
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/test_rules.py +1 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/test_types.py +1 -0
- parse_bench-1.0.7/src/parse_bench/evaluation/metrics/parse/text_v21.py +281 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/utils.py +12 -12
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/stats.py +1 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/extensions.py +17 -4
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/layout_extraction.py +26 -14
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/parse.py +514 -24
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/__init__.py +6 -7
- parse_bench-1.0.7/src/parse_bench/inference/providers/extract/__init__.py +29 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/citations.py +3 -1
- parse_bench-1.0.7/src/parse_bench/inference/providers/layoutdet/__init__.py +33 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/adapters.py +1 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/__init__.py +30 -5
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/_layout_utils.py +2 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/_unlimitedocr2_convert.py +386 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/aeddix_alpine_ocr_kdl.py +58 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/anthropic.py +57 -50
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/anyformat.py +471 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/cohere_parse.py +511 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +358 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/deepseek.py +241 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/docai.py +412 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/hpd_parsing.py +560 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/hunyuanocr.py +738 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/jinaocr.py +310 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/lightonocr-3.py +472 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/llamaparse_v2_normalization.py +3 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/minicpm_ocr.py +243 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/nemotron_parse_3_5.py +246 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/nutrient_dws.py +664 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/openai.py +176 -12
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/ovisocr2.py +357 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/ovisocr3.py +530 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/teleocr.py +402 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/unlimitedocr2.py +270 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/upstage.py +235 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/upstage_normalization.py +127 -0
- parse_bench-1.0.7/src/parse_bench/inference/providers/parse/wevisdoc.py +386 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/registry.py +26 -2
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/layout_projection.py +21 -1
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/pipeline/cli.py +6 -3
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/extract_output.py +2 -2
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/layout_detection_output.py +52 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/parse_output.py +14 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/loader.py +5 -5
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/parse_rule_schemas.py +53 -11
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/schema.py +3 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/evaluators/test_layoutdet_missing_ro_index.py +81 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_anyformat_prediction_granularity.py +79 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_registry.py +196 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_retained_typed_writers.py +140 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/layout_adapters/test_rotated_attribution_adapters.py +595 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/attribution/test_attribution_overclaim.py +19 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/attribution/test_rotated_attribution.py +170 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_attributed_inline_tags.py +95 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_chart_json_to_html.py +10 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_diagram_rules.py +66 -1
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_form_field_rule.py +43 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_latex_arrow_length.py +73 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_latex_script_order.py +49 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_mark_color_rule.py +87 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_presence_rule.py +119 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_repetition_overshoot_rule.py +129 -0
- parse_bench-1.0.7/tests/parse_bench/evaluation/metrics/parse/test_rule_alarm_thread_context.py +138 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_extraction.py +28 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_splitting.py +158 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_aeddix_alpine_ocr_kdl.py +71 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +136 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_anyformat.py +344 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_databricks_chart_descriptions.py +17 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_databricks_rest.py +49 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_docai.py +228 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_hpd_parsing.py +736 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_hunyuanocr.py +914 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_lightonocr_3.py +117 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_minicpm_ocr.py +69 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nemotron_parse_3_5.py +65 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nutrient_dws_errors.py +102 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_nutrient_dws_markdown.py +106 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +269 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_ovisocr2.py +298 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_ovisocr3.py +77 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_teleocr.py +370 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_unlimitedocr2.py +70 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_upstage.py +475 -0
- parse_bench-1.0.7/tests/parse_bench/inference/providers/parse/test_wevisdoc.py +387 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_layout_extraction.py +12 -0
- parse_bench-1.0.7/tests/parse_bench/inference/test_parse_pipelines.py +172 -0
- parse_bench-1.0.7/tests/parse_bench/test_cases/test_loader.py +91 -0
- parse_bench-1.0.7/tests/parse_bench/test_extensions.py +369 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_extract_integration.py +35 -0
- parse_bench-1.0.7/tests/test_repetition_cli.py +73 -0
- parse_bench-1.0.7/tests/test_text_v21.py +111 -0
- parse_bench-1.0.7/tests/test_text_v21_isolation.py +28 -0
- parse_bench-1.0.4/src/parse_bench/data/download.py +0 -127
- parse_bench-1.0.4/src/parse_bench/inference/providers/extract/__init__.py +0 -22
- parse_bench-1.0.4/src/parse_bench/inference/providers/layoutdet/__init__.py +0 -25
- parse_bench-1.0.4/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +0 -724
- parse_bench-1.0.4/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +0 -71
- parse_bench-1.0.4/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +0 -79
- parse_bench-1.0.4/tests/parse_bench/inference/test_parse_pipelines.py +0 -79
- parse_bench-1.0.4/tests/parse_bench/test_extensions.py +0 -149
- {parse_bench-1.0.4 → parse_bench-1.0.7}/.gitignore +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/LICENSE +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/aggregation_report.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/cli.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison_core.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/comparison_report.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/detailed_report.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/leaderboard_report.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/analysis/metric_definitions.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/data/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/cli.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/extract.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/parse.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/evaluators/qa.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_adapters/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/layout_label_mappers/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metric_aggregation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/constants.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/evaluate.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/attribution/text_utils.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/downstream/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/json_subset_match.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/json_subset_match_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/list_unwrap.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/rule_based_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/test_rules.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/extract/test_types.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/core.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/extract_adapter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/parse_adapter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/rule_filters.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/field_grounding/value_compare.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/layoutdet/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/_vendor_grits_reference.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/cross_page_table_consistency.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/emphasis_spans.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/fast_tree_edit.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/grits_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/grits_reference_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/header_accuracy_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/config.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/postprocess.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/llm_normalization/strategy_judge.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/mermaid_graph.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rule_based_judge_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_bag.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_chart.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_heading.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_list.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_page_decoration.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_table.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_text.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/rules_watermark.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/structural_consistency_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_merging.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_pairing.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_parsing.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/table_title_stripping.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/teds_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/text_content_projection.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/parse/text_similarity_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/qa/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/metrics/qa/answer_comparison.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/qa/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/qa/llm_service.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/csv.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/html.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/markdown.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/reports/rule_csv.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/evaluation/runner.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/geometry/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/geometry/rotated_bbox.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/chunkr_layout_extraction.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/cli.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/extract.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines/layout.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/pipelines.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/cancellation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/extend.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/extract/llamaextract_v2_api.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/base.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/chandra.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/docling.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/dots_ocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/layout_v3.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/layout_v3_byoc.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/paddle.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/qwen3vl.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/surya.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/layoutdet/yolo.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/_docling_common.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/amazon_nova.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/azure_document_intelligence.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/chandra2.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/chunkr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/datalab.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/deepseekocr2.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/docling.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/docling_serve.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/dots_ocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/extend_parse.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/falconocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/florin_parser_nano.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/gemma4.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/glm_zai.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_agentic_vision.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_docai.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/google_docai_layout_normalization.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/granite_vision.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/infinity_parser2.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/kdl_frontier_nano.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/landingai.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/liteparse.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/llamaparse.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/markitdown.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru25.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru2605pro.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mineru_diffusion.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/mistral_ocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/nemotron_omni.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/oi_parser.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/opendataloader.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/paddleocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pdf_inspector.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pulse.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pymupdf.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pymupdf4llm.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/pypdf.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/qwen.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/rakedoc_nano.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/reducto.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/surya2.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/tesseract.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/textract.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/unlimitedocr.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/unstructured.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/providers/parse/warp_ingest.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/renormalize.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/inference/runner.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/layout_label_mapping.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/pipeline/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/py.typed +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/evaluation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/layout_ontology.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/metrics.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/pipeline.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/pipeline_io.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/schemas/product.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/bbox_value_strict_comparator.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/extract_field_paths.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/layout_attribution_generation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/rule_filters.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/test_cases/rule_ids.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/__init__.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/gemini_layout_utils.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/src/parse_bench/utils/text_aggregation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_consistency.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_core.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_comparison_directory_suffix.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/analysis/test_detailed_report.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_extract_empty_expected_output.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_layout_rule_filter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_styling_rollup.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_table_pages.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_docling_parse_layout_adapter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_attribution_scope.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_canonical_layout_pages.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_llamaparse_label_mapper.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_attributes.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_dual_read.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/layout_label_mappers/test_pymupdf4llm_label_mapper.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/extract/test_json_subset_match.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/field_grounding/test_extract_adapter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_average_precision.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_classification_utils_paging.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/layoutdet/test_rotated_iou.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_chart_data_point_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_chart_label_punctuation.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_degenerate_marker_rules.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_fast_table_parity.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_formatting_rule_adjacent_spans.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_perf_equivalence.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_grits_trm_composite.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_header_accuracy_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_heading_structure_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_merge_preceding_titles.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_normalize_cell_text.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_page_decoration_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_combining_mark_tokenization.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_quotes.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_list_level_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_parse_table_cell_augmentation.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_relaxed_normalize_cell_text.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_side_inputs.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_caption_title_band.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_dot_leaders.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_marker_cells_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_merging_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_pairing.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_record_match_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_row_header_th.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_tbody_provenance.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_table_title_stripping.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_teds_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_color_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_content_projection.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_text_similarity_metric.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_title_hierarchy_inapplicable.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/parse/test_watermark_removal_rule.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/metrics/qa/test_answer_comparison_exact_choice.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_cli_detailed_report_nonfatal.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_aggregation.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_result_files.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_runner_worker_timeout.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/evaluation/test_stats.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/geometry/test_rotated_bbox.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/extract/test_extend_cost_stats.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/extract/test_extend_schema_adapter.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_amazon_nova.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_azure_document_intelligence_layout.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_chandra2_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_datalab.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_deepseekocr2_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_extend_parse_pages.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_falconocr_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_gemma4_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_glm_zai.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_google_parse_pricing.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_granite_vision_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_infinity_parser2.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_kdl_frontier_nano.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_layout_coordinate_frames.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_layout_utils.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_liteparse_layout.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_picture_type.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_polling.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_usage_metadata.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_normalization.py +0 -0
- {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
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru25_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru2605pro_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_mineru_diffusion_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_nemotron_omni_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_paddleocr_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_pymupdf4llm.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_qwen.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_reducto_normalize.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_surya2_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_textract_cost.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_unlimitedocr_multipage.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/providers/parse/test_warp_ingest.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_cli.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_renormalize.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/inference/test_runner.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_loader_stem_twins.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_parse_rule_schemas.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_cases/test_rule_ids.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_evaluation_schema_extra_fields.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/parse_bench/test_layout_label_mapping_code_alias.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_data_dir_routing.py +0 -0
- {parse_bench-1.0.4 → parse_bench-1.0.7}/tests/test_llamaparse_base_url.py +0 -0
- {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.
|
|
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
|
[](https://parsebench.ai)
|
|
134
139
|
[](https://arxiv.org/abs/2604.08538)
|
|
135
140
|
[](https://huggingface.co/datasets/llamaindex/ParseBench)
|
|
141
|
+
[](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge-link?eval=32432)
|
|
136
142
|
[](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 |
|
|
156
|
-
| 2 | LlamaParse Agentic | LlamaParse |
|
|
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 |
|
|
159
|
-
| 5 |
|
|
160
|
-
| 6 |
|
|
161
|
-
| 7 |
|
|
162
|
-
| 8 |
|
|
163
|
-
| 9 |
|
|
164
|
-
| 10 |
|
|
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
|
[](https://parsebench.ai)
|
|
4
4
|
[](https://arxiv.org/abs/2604.08538)
|
|
5
5
|
[](https://huggingface.co/datasets/llamaindex/ParseBench)
|
|
6
|
+
[](https://paperswithcode.co/api/v1/papers/2604.08538/leaderboard-badge-link?eval=32432)
|
|
6
7
|
[](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 |
|
|
26
|
-
| 2 | LlamaParse Agentic | LlamaParse |
|
|
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 |
|
|
29
|
-
| 5 |
|
|
30
|
-
| 6 |
|
|
31
|
-
| 7 |
|
|
32
|
-
| 8 |
|
|
33
|
-
| 9 |
|
|
34
|
-
| 10 |
|
|
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"]
|
|
@@ -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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|