OdooClaw Vision 450M

Local invoice extraction for Odoo — read PDFs, create vendor bills, zero cloud.

Fine-tuned LFM2.5-VL-450M-Extract (Liquid AI) for document extraction inside Odoo. This is the vision companion to OdooClaw Light 1.2B FT: the chat model handles the conversation, this model reads the invoices.

What it does

  • Extracts structured data from invoice images: vendor, VAT, invoice number, date, client, subtotal, tax, total
  • Feeds the OdooClaw ocr-invoice MCP: PDF → image → this model → vendor bill created in Odoo
  • 100% local — the default in production (replaces gpt-4o-mini cloud)
  • Verified end-to-end: PDF attachment → vendor bill created in Odoo (account.move), partner auto-matched, attachment linked

Why this model

  • 450M params — the smallest model of its class, runs anywhere (even the Mac Mini M1)
  • Specialized in document extraction (Liquid's 2,000-invoice benchmark):
    • JSON Validity: 98.9% | F1: 98.8% | VLM Judge: 84.5
    • Beats models 4x its size (InternVL3.5-2B: 99.6/99.2/87.7)
  • OCRBench: 684
  • 128K context

Files — WHICH QUANTIZATION TO USE

File Size Verdict
odooclaw-vision-q6km.gguf 280MB RECOMMENDED — verified 8/8 (100%) extraction success on CPU
odooclaw-vision-q4km.gguf 219MB ⚠️ Q4_K_M causes repetition loops on CPU — JSON never closes (0/8)
mmproj-odooclaw-vision-f16.gguf 189MB Required (vision tower) — use with either

Important empirical finding: at 450M scale, Q4_K_M quantization is too aggressive for stable CPU extraction — the model enters repetition loops ("imquestos imquestos ...") and never emits valid JSON. Q6_K is the sweet spot: 100% success in 8/8 trials, only 61MB larger. Use Q6_K.

Verified extraction (real tests, 2026-08-07, N100 CPU, llama.cpp build 525)

Test 1 — generated ES invoice (DejaVu font, pdftoppm 170 DPI):

{"vendor_name": "Suministros Industriales García S.L.", "invoice_number": "b76543210",
 "date": "05/07/2026", "total": "2541.00 euro", "tax": "441.00 euro"}

Test 2 — Odoo demo vendor bill → CREATED IN ODOO:

{
  "success": true, "move_id": 26, "partner_id": 45, "attachment_linked": true,
  "invoice_data": {
    "partner_name": "Azure Interior Solutions Private Limited",
    "invoice_date": "2018-09-30", "ref": "692130859",
    "amount_tax": 541.1, "amount_total": 541.1
  }
}

Key fields (vendor, date, ref, totals) extracted and a real vendor bill was created in Odoo with the PDF attached — fully local.

Usage (llama.cpp)

# IMPORTANT: llama.cpp build 525+ required (LFM2-VL support)
llama-server -m odooclaw-vision-q6km.gguf \
  --mmproj mmproj-odooclaw-vision-f16.gguf \
  --port 8093 -c 8192 -t 3 \
  --temp 0.0 --top-k 50 --repeat-penalty 1.05 --jinja

Send the invoice image as a data URL (data:image/png;base64,...) with the image BEFORE the text prompt — verified critical for the 450M (text-first → garbage output).

Prompt notes (from testing)

  • Keep the prompt short: "Extract invoice data as JSON only. Return JSON with vendor_name, invoice_number, date, total, tax."
  • No inline JSON schema: showing the schema makes the 450M echo it back empty
  • max_tokens ~150: enough for the JSON, prevents repetition loops
  • Image first, text last in the content array

Conversion notes

Built from the official Extract PyTorch weights: language model exported separately (709MB f16 → quantize to Q6_K) + vision tower as mmproj (189MB). MLX conversion not yet available (mlx_lm 0.29 drops the vision tower).

License

Apache 2.0 — free for everyone, that's the whole point.

Downloads last month
89
GGUF
Model size
0.4B params
Architecture
lfm2
Hardware compatibility
Log In to add your hardware

We're not able to determine the quantization variants.

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for nicolasramos/odooclaw-vision-450m

Quantized
(2)
this model