Why did we open-source our inference engine? Read the post

Read receipts and handwriting more accurately than Mistral OCR 4.1, for 93% less

Send a photo of a receipt or a handwritten note and get its text back, with amounts, dates and names as written. SIE runs GLM‑OCR, an open model built to read documents, and charges per photo.

GPT‑6 Luna and Mistral OCR 4.1 change and drop receipt amounts

GPT-6 Luna, max reasoning

Amounts changed in 3 of 5 runs
Photo Faded receipt rows: 1 Nila Bakar/Goreng 27,500; 1 Sop Gurame 87,000; 1 Teh Poci 25,000
Full photo · NAVER Clova CC BY 4.0
Returned text
1 Nila Bakar/Goreng 77.500
1 Sop Durian 37.000
1 Teh Poci 25.000

Mistral OCR 4.1

5 of 7 amounts missing
Photo Receipt: Black Pepper Meatball Pas 79,000; Truffle Cream 77,000; Earl Grey Milk Tea 59,000; subtotal 215,000; service charge 12,900; tax 22,790; total 250,690
Full photo · NAVER Clova CC BY 4.0
Returned text
79,000
1 BLACK PEPPER MEATBALL PAS
1 TRUFFLE CREAM
1 EARL GREY MILK TEA
SUBTTL
Service Charge 6%
TAX 10%
TOTAL
250,690

Not in the reply: 77,000 · 59,000 · 215,000 · 12,900 · 22,790

Ahead of Mistral OCR 4.1 and GPT‑6 Luna, at the lowest price tested

Accuracy against cost
372 photos
Photos read correctly ↑ Cost per 1,000 photos →
Share of 372 receipt and handwriting photos read with every line and every amount, date, name and number correct, against list-price cost per 1,000 photos
ModelPhotos read correctlyCost per 1,000 photos
GLM-OCR on SIE71.0%$0.25
Claude Haiku 5.572.3%$0.31
GPT-6 Luna (max reasoning)66.1%$2.39
Mistral OCR 4.162.1%$4.00
Claude Sonnet 5.578.0%$6.40
GPT-6.1 Sol (low reasoning)78.2%$6.64
Photo transcription

372 public photos: 200 receipts and 172 handwritten pages

Correct
Every line read, with every amount, date, name and number as written
Lead
8.9 points more photos correct than Mistral OCR 4.1 (95% interval 4.0 to 13.7)
Prices
Real-time list prices on each model's recorded usage; SIE Serverless from 2026-10-13

Send a photo, get its text back

from pathlib import Path
from sie_sdk import SIEClient
​
client = SIEClient(api_key="API keysk-sie-…")
​
image = {"data": Path(imagereceipt.jpgbrowse).read_bytes(), "format": "jpeg"}
result = client.extract(
"modelzai-org/GLM-OCR",
{"images": [image]},
)
print(result["entities"][0]["text"])
import { readFile } from 'node:fs/promises';
import { SIEClient } from '@superlinked/sie-sdk';

const client = new SIEClient(undefined, { apiKey: 'sk-sie-…' });

const image = await readFile("receipt.jpg");
const result = await client.extract(
  'zai-org/GLM-OCR',
  { images: [image] },
  { labels: [] },
);
console.log(result.entities[0].text);
images_bytes=$(base64 < 'receipt.jpg' | tr -d '\n')
curl https://api.superlinked.com/v1/extract/zai-org%2FGLM-OCR \
  -H "Authorization: Bearer sk-sie-…" \
  -H "Content-Type: application/json" \
  -d "{\"items\":[{\"images\":[{\"data\":\"$images_bytes\",\"format\":\"jpeg\"}]}]}"
Build the "OCR" capability into my app using the Superlinked Inference Engine (SIE).

Context
- SIE is an OpenAI-style inference API. Python SDK: `from sie_sdk import SIEClient`; TypeScript: `@superlinked/sie-sdk`.
- Base URL: https://api.superlinked.com (or my regional endpoint). Auth: Bearer key from env `SIE_API_KEY` (never hard-code it).
- Model: zai-org/GLM-OCR (SIE primitive: /extract). Keep the model id configurable.

Task
- Input: an uploaded image containing text.
- Behaviour: return the text visible in the image
- Call the selected SIE primitive once per request and map the response into your domain type.

Deliverables
- A typed client wrapper, an application-level function for this task, error handling for timeouts/empty input, and unit tests with a stubbed client.
- Wire it into my existing stack (ask me which framework if unclear) and add a short usage example.
Output
2 Ayam Bakar 55,000
2 Nasi Putih 20,000
1 Nila Bakar/Goreng 27,500
1 Sop Gurame 87,000
1 Teh Poci 25,000

SUBTOTAL 214,500
Service 12,870
Pajak Restoran 22,737

TOTAL 250,107

Read a million photos for $250

Self-hosted (Kubernetes)

SIE in your clusters, backed by our engineers.

  • Data stays in your own cloud account
  • Same models and API as Serverless
  • Terraform to your cloud in minutes

Run locally

The open-source server on your own machine.

docker run --gpus all -p 8080:8080 ghcr.io/superlinked/sie-server:latest-cuda12-sglang-vision-extract

Switch to SIE in 5 minutes

import base64
from mistralai.client import Mistral

image = base64.b64encode(open("receipt.jpg", "rb").read()).decode()
client = Mistral(api_key="…")
result = client.ocr.process(
    model="mistral-ocr-4-1",
    document={"type": "image_url", "image_url": f"data:image/jpeg;base64,{image}"},
)
print(result.pages[0].markdown)
import base64
from openai import OpenAI

image = base64.b64encode(open("receipt.jpg", "rb").read()).decode()
reply = OpenAI().responses.create(
    model="gpt-6-luna",
    input=[{"role": "user", "content": [
        {"type": "input_text", "text": "Transcribe all readable text in the image."},
        {"type": "input_image", "image_url": f"data:image/jpeg;base64,{image}"},
    ]}],
)
print(reply.output_text)
import base64
import anthropic

image = base64.b64encode(open("receipt.jpg", "rb").read()).decode()
reply = anthropic.Anthropic().messages.create(
    model="claude-haiku-5-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": [
        {"type": "text", "text": "Transcribe all readable text in the image."},
        {"type": "image", "source": {
            "type": "base64", "media_type": "image/jpeg", "data": image,
        }},
    ]}],
)
print(reply.content[0].text)
SIE
from sie_sdk import SIEClient

client = SIEClient(api_key="sk-sie-…")
image = {"data": open("receipt.jpg", "rb").read(), "format": "jpeg"}
result = client.extract("zai-org/GLM-OCR", {"images": [image]})
print(result["entities"][0]["text"])
from sie_sdk import SIEClient

client = SIEClient(api_key="sk-sie-…")
image = {"data": open("receipt.jpg", "rb").read(), "format": "jpeg"}
result = client.extract("zai-org/GLM-OCR", {"images": [image]})
print(result["entities"][0]["text"])
from sie_sdk import SIEClient

client = SIEClient(api_key="sk-sie-…")
image = {"data": open("receipt.jpg", "rb").read(), "format": "jpeg"}
result = client.extract("zai-org/GLM-OCR", {"images": [image]})
print(result["entities"][0]["text"])

Contact us

Tell us about your use case and we'll get back to you shortly.

Apply for an inference grant

Free capacity on our hosted cluster for selected projects. Tell us what you run and we reply by email.