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