benchmark playgroup

UK Charity Document Extraction — Multi-Model Benchmark

Extract structured fields from UK charity financial PDFs using LLMs via OpenRouter, the Doubleword Batch API, or V7 Go, then score and rank results across every run in data/.

repo: playgroup_202602_docextract dataset: Kleister Charity (11 PDFs) fields: 8
Open latest playground All 21 snapshots View on GitHub QUICKSTART

Results snapshot: 2026-08-22 · 111 scored runs · playground 2026-08-22T0830Z (21 archived versions from git history)

Who is this for?

Key findings

Provider aggregates match python score.py over every data/*_dev_extracted__*.tsv file on 2026-08-22: 111 scored runs (40 OpenRouter, 38 Doubleword, 33 V7 Go). Registries: 33 OpenRouter keys, 31 Doubleword models, 32 V7 keys.

Provider Models Active Failed Avg F1 Best F1 Best model Avg fields Avg time Avg cost
Doubleword 38 36 2 0.812 0.943 dw-qwen3.8-27b 63.5/85 (75%) 763s $0.036
OpenRouter 40 27 13 0.753 0.946 gemini-3-pro 56.0/85 (66%) 1314s $0.092
V7 Go 33 33 0 0.833 0.852 gpt4-1 62.8/85 (74%) 124s $0.000

Doubleword’s average F1 among active models (0.812) edges OpenRouter (0.753); OpenRouter still holds the highest single-model F1 (gemini-3-pro, 0.946). dw-qwen3.8-27b ranks 2nd at 0.943. V7 averages 0.833 F1 with no failed runs in this snapshot. V7 cost stays at zero until price_in / price_out are set in config_models_v7.py.

Top 5 models by F1

Rank Model Provider F1 Precision Recall Fields found
1gemini-3-proOpenRouter0.9460.9750.91878/85
2dw-qwen3.8-27bDoubleword0.9430.9870.90377/85
3=dw-qwen3-5-397b-a17b-dottxtDoubleword0.9420.9750.91177/85
3=dw-kimi-k3Doubleword0.9420.9750.91177/85
5qwen3-235bOpenRouter0.9370.9750.90277/85

Takeaways

Interactive playground

The hosted playground is a static snapshot generated by python playground.py in the repo. Eight tabs: Rankings, Field Heatmap, Document Analysis, Error Breakdown, Deep Dive, Recommendations, Provider Analysis, and Project Evolution.

Two scoring views: Rankings and Provider Analysis use semantic F1 from score.py; heatmaps and error tabs use exact-match vs expected TSV. F1 can exceed exact-match when values are close but not identical — that is expected.

Open latest (2026-08-22T0830Z) Browse all snapshots

Playground version history

Each row is a frozen copy of which-models-extracted-playground.html from git, named with its commit time in UTC. Use this to see how the benchmark grew from 40 OpenRouter-only models (Feb 2026) to 111 scored runs across three providers (Aug 2026).

Snapshot (UTC) Models F1 runs Highlights
2026-08-22T0830Z111111Latest — dw-deepseek-ocr-2 OCR resultsOpen
2026-08-21T2219Z111111dw-qwen3.8-27b, dw-muse-glimmer-30bOpen
2026-08-21T2145Z109109Tab sync fix across all dashboardsOpen
2026-08-09T0746Z109109Aug 2026 benchmark refreshOpen
2026-07-29T1317Z10710734 Doubleword modelsOpen
2026-04-11T1748Z8585V7 Go provider addedOpen
2026-03-07T2116Z4747Provider Analysis tabOpen
2026-03-07T2104Z4747F1 scoring & provider summaryOpen
2026-02-28T1312Z40First leaderboard (exact-match tabs)Open

View all 21 snapshots with search and filters →

Dataset & fields

Small export from the Kleister Charity dataset (dev-0): 11 UK charity financial PDFs (up to 200 pages each) with pre-extracted OCR text. Data is UK open data — see Kleister license.

charity_number charity_name report_date income_annually_in_british_pounds spending_annually_in_british_pounds address__postcode address__post_town address__street_line

Workflow (local)

Step-by-step video guide for Doubleword batch runs: extractor.py --all-doubleword.

# Smoke test
python llm_openrouter.py

# Extract (auto-detects OpenRouter / Doubleword / V7 from registries)
python extractor.py gemini-2.0-flash
python extractor.py --all-doubleword
python extractor.py --all-v7

# Score and regenerate playground
python score.py
python playground.py

Repo essentials

github.com/neomatrix369/playgroup_202602_docextract Back to home