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

Read the page once, then fill any schema from that text

Superlinked gives your agent one API to turn a page into Markdown, then fill typed fields from that same text.

Get started
Page image
Page 78 of NVIDIA's 2026 annual report, showing two financial tables

NVIDIA 2026 annual report, page 78

Markdown, table rows as HTML lightonai/LightOnOCR-2-1B
    <tr>
      <td>Stock-based compensation expense</td>
      <td>(6,386)</td>
      <td>(4,737)</td>
      <td>(3,549)</td>
    </tr>
Typed fields Qwen/Qwen3.8-27B-FP8
fy2026
-6386
fy2025
-4737
fy2024
-3549

Nobody has to reopen the original to check a field

Photographed label

The barcode settles a date the printed label cannot

12/02/2024 is either 12 February or 2 December, depending on where the label was printed. Stage 1 also kept the GS1 element string under the barcode, where application identifier 15 gives the same date as 240212. Asked for an ISO date, stage 2 answered 2024-02-12.

Photographed product label with a GTIN, a best-before date and a GS1-128 barcode
Markdown lightonai/LightOnOCR-2-1B
(01)27394376616222(15)240212(10)3043AAG
Typed fields Qwen/Qwen3.8-27B-FP8
Field On the page Returned
gtin 27394376616222 27394376616222
printed_best_before 12/02/2024 12/02/2024
best_before (15)240212 2024-02-12
batch 3043AAG 3043AAG
Born-digital invoice

The page's own title, licence and repository note stay out of the record

This page is an invoice template, so the rendered image carries a heading, a licence line and a link to its repository around the invoice itself. Stage 1 read all of it. The schema asked for invoice fields, and the record holds invoice fields: the currency came back as USD from a printed dollar sign, and the total came off a row that prints the label and the amount together.

A rendered one-page HTML invoice template, with its own title and licence line above the invoice
Markdown lightonai/LightOnOCR-2-1B
Invoice #: 123  
Created: January 1, 2023  
Due: February 1, 2023

Acme Corp.  
John Doe  
john@example.com
Typed fields Qwen/Qwen3.8-27B-FP8
Field On the page Returned
invoice_no Invoice #: 123 123
contact_email john@example.com john@example.com
total Total: $385.00 $385.00
currency $ USD
Born-digital report page

Parenthesised rows come back negative, and the reconciliation still adds up

A financial table prints a negative as a number in brackets, and a field typed as an integer has to carry the sign instead. Stage 2 read (259) as -259 across every bracketed row, and the reconciled total on the last line came back positive, from the same recorded text.

Page 78 of NVIDIA's 2026 annual report, showing two financial tables
Markdown, table rows as HTML lightonai/LightOnOCR-2-1B
    <tr>
      <td>Interest expense</td>
      <td>(259)</td>
      <td>(247)</td>
      <td>(257)</td>
    </tr>
    <tr>
      <td>Other income, net</td>
      <td>9,022</td>
      <td>1,034</td>
      <td>237</td>
    </tr>
    <tr>
      <td>Consolidated income before income tax</td>
      <td>$ 141,450</td>
      <td>$ 84,026</td>
      <td>$ 33,818</td>
    </tr>
Typed fields Qwen/Qwen3.8-27B-FP8
Field On the page Returned
unit (In millions) In millions
rows[Interest expense].fy2026 (259) -259
rows[Other income, net].fy2026 9,022 9022
rows[Consolidated income before income tax].fy2026 141,450 141450

3 of the 7 recorded schema calls are shown here, over 3 of the 6 recorded documents. Between them they registered 45 fields, every one of which matches the printed page, and all 7 of the 7 replies in the run validated against their schema. SOURCES.md reports every recorded document and every registered field.

One call returns the whole page as Markdown

View on GitHub
from pathlib import Path
from sie_sdk import SIEClient
​
client = SIEClient(
api_key="API keysk-sie-…",
base_url="https://api.superlinked.com",
)
​
image = {"data": Path(imagestore-receipt.pngbrowse).read_bytes(), "format": "png"}
result = client.extract(
"modellightonai/LightOnOCR-2-1B",
{"images": [image]},
)
print(result["entities"][0]["text"])
import { readFile } from 'node:fs/promises';
import { SIEClient } from '@superlinked/sie-sdk';

const client = new SIEClient('https://api.superlinked.com', {
  apiKey: 'sk-sie-…',
});

const image = await readFile("store-receipt.png");
const result = await client.extract(
  'lightonai/LightOnOCR-2-1B',
  { images: [image] },
  { labels: [] },
);
console.log(result.entities[0].text);
images_bytes=$(base64 < 'store-receipt.png' | tr -d '\n')
curl https://api.superlinked.com/v1/extract/lightonai%2FLightOnOCR-2-1B \
  -H "Authorization: Bearer sk-sie-…" \
  -H "Content-Type: application/json" \
  -d "{\"items\":[{\"images\":[{\"data\":\"$images_bytes\",\"format\":\"png\"}]}]}"
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: lightonai/LightOnOCR-2-1B (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
Source store-receipt.png
source · store-receipt.png

MARKET 42

Oat milk 3.20

Rye bread 2.80

Coffee beans 9.40

Total 15.40

  • Reads text directly from images and photos

OCR quality and latency

PRICE
$ / 1k pages ↓
$1.5 AWS Textract
$1.5 Google Enterprise Document OCR
$1.5 Azure Document Intelligence Read
$1.86 SIE docling OCR
SIE LightOnOCR 2 1B $2
Mistral OCR 4 $4
QUALITY
Accuracy · olmOCR ↑
SIE LightOnOCR 2 1B 0.78
0.75
0.74
0.33 SIE docling OCR
0.32
0.31
LATENCY
p50 ms ↓
320ms SIE docling OCR
360ms
390ms
SIE LightOnOCR 2 1B 600ms
680ms
720ms

One OCR pass feeds every schema you add

Input One page image A report page, an invoice, a photographed label. PNG or JPEG.
Stage 1 Read the whole page into Markdown lightonai/LightOnOCR-2-1B Tables come back as rows, footnote markers stay attached to the cells that carry them, and reading order survives. The Markdown is yours to keep.
Stage 2 Fill a schema from that text Qwen/Qwen3.8-27B-FP8 Reads the recorded Markdown, never the image. Add a schema and it runs again over the same text, with no second OCR call.

Two calls to https://api.superlinked.com, recorded on 2026-09-16.

Page to Markdown lightonai/LightOnOCR-2-1B POST /v1/extract, once per page across the 6 recorded pages. The Markdown it returns is what every schema below reads.
Markdown to typed fields Qwen/Qwen3.8-27B-FP8 POST /v1/chat/completions with a strict JSON schema. 7 of 7 replies validated, and no request carried an image.
45/45 fields match the printed page, across the 3 schemas shown
7/7 replies valid against their schema, over the whole run
6 documents recorded, 3 shown

Deploy your way

Self-host with K8s

Easy & scalable deployment in your own cloud.

  • Terraform to your cloud in minutes
  • Apache-2.0, same engine as Cloud
  • Scales to zero, no bill between jobs
  • Per-tenant pools, no noisy neighbors
Agent prompt
Deploy SIE to our AWS account with the superlinked/sie/aws Terraform module. Docs: superlinked.com/docs/deploymentDeploy SIE to our GCP project with the superlinked/sie/google Terraform module. Docs: superlinked.com/docs/deploymentDeploy SIE to our Azure AKS cluster via helm install. Requirements: superlinked.com/docs/deployment
Deploy guide

Run locally

Run the same models on your own machine.

  • Runs on NVIDIA GPU or Apple Silicon
  • One command, no Docker or cluster
  • All 100+ Cloud models, fully offline
  • Same SDK and IDs, no code changes
pip install "sie-server[local]" && sie-server servepip install "sie-server[local]" && sie-server serve --device cuda
Quickstart

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.