Documents in, JSON out, with a confidence on every field.
MIST-Extract-1.0 turns a document into structured data. Give it a JSON template and a document as text, a photo or scan, or both, and it fills in the template, telling you how likely each value is to be right. It is a 4B model built for the everyday documents of African businesses and their customers, in English and African languages.

A large share of business data still arrives as documents: a photo of a market receipt, a mobile-money SMS, a utility bill, a tenancy letter. General-purpose extractors are built on Western invoices and forms, and they stumble on naira and cedi amounts, local layouts and names in African languages.
MIST-Extract was trained on exactly those documents, and it does not just return values: every field carries a calibrated confidence, so you can keep the certain fields automatic and send only the doubtful ones to a person.
On 486 held-out English documents (receipts, notices, emails, contracts and more) it gets 91.8% completely right. NuExtract3, built on the same 4B base, gets 67.9%. On English receipt photos it gets every field right.
On MasakhaNER 2.0 named entities in 21 African languages it scores 0.728 field accuracy, against 0.393 for NuExtract3, 0.432 for Qwen3.5-4B and 0.452 for GLiNER2.5-multi.
When it says 0.66, it is right about 66% of the time: calibration error of 0.008 on held-out fields. Values it rates 0.99 and above are right 99.9% of the time.
Uses the same template format as NuExtract, so existing templates move across unchanged. Reads text, one image, or both, and served at a 131,072-token context.
import sys
from huggingface_hub import snapshot_download
path = snapshot_download("olaverse/MIST-Extract-1.0")
sys.path.insert(0, path) # the repo ships mist_extract.py
from mist_extract import Extractor
x = Extractor.from_pretrained(path, device="cuda")
template = {
"merchant": "verbatim-string",
"date": "date",
"total": "number",
"payment_method": ["cash", "card", "mobile money", "bank transfer"],
"items": [{"name": "verbatim-string", "quantity": "integer", "price": "number"}],
}
out = x.extract(template, image="receipt.jpg") # a photo or scan
out = x.extract(template, text="Paid 2,500 naira at Mama Put on 3 May 2024 with my card. 2 plates of jollof.")
out["data"] # {"merchant": "Mama Put", "date": "2024-05-03", "total": 2500, ...}
out["confidence"] # same shape, a number in [0, 1] for each fieldNeed more throughput? MIST-Extract-Flash-1.0 takes the same templates at 2B and runs 1.6× faster.
| MIST-Extract-1.0THIS PAGE | MIST-Extract-Flash-1.0 → | |
|---|---|---|
| Parameters | 4B | 2B |
| English documents fully right (held-out) | 91.8% | 90.5% |
| Named entities, 21 African languages | 0.728 | 0.701 |
| Field accuracy, all held-out documents | 0.898 | 0.879 |
| Speed, one RTX A6000 | 6.0 docs/s | 9.7 docs/s |
| Confidence calibration error (ECE) | 0.008 | 0.022 |
| Best for | Top accuracy, general and African documents | Volume and receipts |
Fill a JSON template from a photo, a scan or plain text, with a calibrated confidence on every field. Built for African documents and currencies, in English and African languages.
/ Extraction · DecisionsPull the amount, sender, reference and date out of mobile-money and bank SMS, then decide in one pass whether it is genuine, which account it belongs to and whether anyone needs to look at it.
typed-decisions 0.720 · African TD 0.668
PurpleMISTtyped-decisions 0.601 · 1.9B
LID-6080.867 acc · 140M
LID-60837 MB · 6,800 texts/s
DiacNetDER 0.0117 · 582M
DiacNetDER 0.0141 · 300M
DiacNetDER 0.0130 · 37.9M
MIST QG0.955 keep-rate · 25 langs