Schemer: On-device Text to Structured JSON
On-device structured extraction that turns free text plus your JSON Schema into a typed JSON object, with explicit absence detection instead of hallucinated fields.
Schemer takes free text and a developer-supplied JSON Schema and returns a JSON object that matches it, with type guarantees instead of generative text. Plain JSON Schema in (OpenAI and Gemini compatible), typed JSON out. Its edge is absence detection: knowing when a field is simply not in the text, at 0.91 against 0.18 to 0.43 for prompted LLMs, which is exactly where generative extractors fail. The model is general; the launch reference is task creation.
Demo
Performance
0.77 accuracy on unseen, out-of-distribution schemas at just 211M parameters and 111 MB on disk, plus 0.91 absence detection where prompted LLMs score 0.18 to 0.43.
9,021 held-out records across seven usage slices, 13 languages (internal)
| Model | Accuracy | Absence | Params | Disk |
|---|---|---|---|---|
| Gemma 4 26B A4B | 0.834 | 0.428 | 26.6B | 17.2 GB |
| Claude Haiku 4.5 | 0.816 | 0.431 | n/a | API |
| Qwen 3.5 9B | 0.812 | 0.434 | 9.1B | 9.1 GB |
| Ministral 3 8B | 0.790 | 0.430 | 8.0B | 17.8 GB |
| Gemma 4 E2B | 0.780 | 0.427 | 5.1B | 8.3 GB |
| Schemer (int8) | 0.776 | 0.911 | 211M | 218 MB |
| Schemer (int4) | 0.769 | 0.908 | 211M | 111 MB |
| Qwen 3.5 0.8B | 0.651 | 0.351 | 0.87B | 1.75 GB |
| NuExtract-2.0-2B | 0.643 | 0.393 | 2.2B | 4.4 GB |
| GLiNER2-multi | 0.585 | 0.374 | 307M | 309 MB |
| GLiNER2-base | 0.524 | 0.368 | 205M | 834 MB |
| NuExtract-tiny-v1.5 | 0.334 | 0.222 | 0.5B | 954 MB |
| FunctionGemma 270M | 0.288 | 0.181 | 0.27B | 540 MB |
Internal evaluation on 9,021 held-out records; competitors run on the same held-out set.
Use cases
Natural language to calendar entry
Turn "Lunch with Priya next Thursday at 1, about an hour" into a typed event: title, start datetime, duration, and recurrence. Runs in a keyboard or notes app, on device and offline.
Messages into structured records
Turn a chat message, email, or scanned note into a CRM lead, order, or invoice: names, emails, amounts, and dates, each decoded to its real type, with missing fields returned as null instead of guessed.
Cleaner input for on-device LLMs
Pre-structure messy text into validated, typed fields before it reaches an on-device LLM. Clean structured input instead of raw prose cuts hallucination and token cost and lifts accuracy, all without leaving the device.
On-device agents and form-fill
Hand a local agent a JSON Schema and free text and get typed JSON back to trigger an action or prefill a form, with no cloud LLM and no per-call cost.
Reviews and feedback into ratings
Score a free-text review into a typed star rating, a sentiment label (positive, mixed, negative), and flags like would-repurchase, ready to sort or route without reading each one.
Normalize messy records
Batch-convert inconsistent free-text records, notes, logs, or exported spreadsheets into one clean typed schema, with absent fields flagged rather than invented, on device.
What it does
- Plain JSON Schema in (OpenAI and Gemini compatible), typed JSON out
- Decodes strings, numbers, booleans, datetimes, labels, and arrays to their real types
- Explicit absence detection: reports a field as missing instead of inventing a value
- Works across 13 languages from a single model, with no per-language setup
Specs
- Parameters
- 211M (pruned mmBERT-base encoder)
- Accuracy
- 0.776 (int8), 0.911 absence detection
- Size
- 111 MB (int4 AWQ), 218 MB (int8)
- Formats
- Core ML and ONNX, cross-platform
Early access
Tell us what you are building and we will get you set up.