OCR model matrix (local probes)¶
Which vision tags to try first. Everyday path: OCR · installation.
Live probe of installed Ollama vision tags on tests/fixtures/mini_page.png plus spot checks on the green notebook (handwriting). Re-run after pulling new models:
PYTHONPATH=src python scripts/probe_ollama_vision_models.py --json .test_outputs/model_probe_results.json
Probe uses the same prompt lane as a real job (faithful_markdown, or a model recipe such as DeepSeek-OCR free_ocr). Last run: 2026-08-23 on Ollama against http://localhost:11434.
Picker lists are filtered in the UI and enforced at job start — see model_selection.py.
Picker policy (shipped)¶
Picker |
Shows |
Excludes |
|---|---|---|
Vision / OCR |
OCR-oriented tags, recommended VLMs ( |
Thinking models ( |
Text analysis / cleanup |
Completion/chat LLMs |
Vision, embedding, OCR-oriented tags |
Why your job failed (empty_output)¶
The green notebook job (7ce4752e…) used gemma4:26b. That tag is a thinking vision model: on many dense pages it spends the full num_predict budget (4096) internally and returns no visible text. Transcribe correctly marks that as failed (empty_output / “model returned no text”) — not a timeout or Ollama crash.
Spot checks on green pages (same faithful_markdown prompt):
Page |
gemma4:26b |
glm-ocr |
granite3.2-vision |
|---|---|---|---|
green 130.jpg |
text (778 chars) |
text |
text |
green 131.jpg |
empty (eval=4096) |
text |
text |
green 156.jpg |
empty (eval=4096) |
text |
text |
green 157.jpg |
empty (eval=4096) |
text |
text |
Fix: In Workflow → Transcribe (or notebook settings), switch to an OCR-oriented or recommended tag below, then re-run (use Force if fingerprints skip pages).
Mini-page probe summary¶
Model |
Load |
OCR on fixture |
Notes |
|---|---|---|---|
glm-ocr:latest |
ok |
ok |
Best OCR-oriented pick; may loop on long output (watch |
deepseek-ocr:latest |
ok |
ok |
Uses |
granite3.2-vision:latest |
ok |
ok |
Fast, reliable general VLM for handwriting |
qwen2.5vl:3b / 7b |
ok |
ok |
Good size/quality trade-off |
minicpm-v:8b |
ok |
ok |
Small general VLM; compare pass |
gemma3:4b / 12b |
ok |
ok |
Non-thinking Gemma vision |
llava:7b |
ok |
ok |
General VLM — compare pass only |
devstral-small-2:latest |
ok |
ok |
Large; chatty wrapper text |
qwen3-vl:4b |
ok |
ok |
Thinking; slower |
qwen3-vl:8b |
ok |
empty |
Thinking burned 512 tokens with no text on fixture |
qwen3.6:27b |
ok |
ok |
Thinking family — risky on dense pages |
gemma4:26b |
ok |
ok on fixture |
High empty-OCR risk on real notebook pages (see above) |
llama3.2-vision:11b |
fail |
error |
|
Tags without vision in Ollama discovery are omitted from vision pickers unless they match OCR-oriented name heuristics. A previously saved unsuitable tag (for example gemma4) is warned but not listed — pick a model from the filtered list and save settings.
Recommended first OCR picks¶
OCR-oriented:
glm-ocr,deepseek-ocr(recipe applies automatically)General vision (probed):
granite3.2-vision,qwen2.5vl:7b(or:3bfor speed)Compare / second pass:
minicpm-v,llava— after a solid first model
Avoid for first OCR¶
Tag family |
Why |
|---|---|
Thinking ( |
Often |
llama3.2-vision |
Fatal model-load on current Ollama (mllama) — circuit opens after first page |
General VLMs first ( |
Timeouts on dense scans; use after an OCR-oriented first pass |
Picker copy and Model information expander follow model_advice.py. Per-tag prompt lanes: ocr_model_recipes.md. Product limits: known_limitations.md.