Most AI tasks no longer need a frontier model Read launch post

Convert pages to Markdown 48% cheaper than Mistral OCR 4.1

LightOnOCR-3 turns scanned page images into Markdown with table structure and reading order. SIE is the open-source inference engine that serves this document model.

LightOnOCR-3 on SIE

Table rows kept together
Markdown
CharacteristicSpecificationMethod of analysis
Al, as Methomyl87.5 - 92.5 %High Performance Liquid Chromatography
pH (1 % in water)4.0 - 8.0pH-meter
AppearanceWhite to cream powderVisual

Missing tables and altered words break the record

GPT-6 Luna (no reasoning)

Title word changed
Source title

TÍTULO DEL DOCUMENTO

El ciclomontañismo una experiencia significativa Universitaria, en la Universidad de Cundinamarca

Universidad de Cundinamarca, document title
Returned Markdown (excerpt)

El ciclomañanismo una experiencia significativa Universitaria, en la Universidad de Cundinamarca

The title’s key word changes. An exact search for the original title no longer matches.

Read the complete recording

Claude Sonnet 5.5 (thinking off)

Metric tables omitted
One of the source’s metric tables
Source table: accuracy 95%, sensitivity 93.75%, specificity 96.25%, precision 96.15%, F1 score 0.9494 and MCC 0.9003.
Xu et al., Scientific Reports (2022), Figure 1A
Returned Markdown (excerpt)
**Figure 1.** The classifier of the DNN models based on the matrices $M$, $M_{kinematics}$, $M_{kinetics}$.

All three metric tables are absent from the complete response.

The caption survives; the values needed to compare the results disappear.

Read the complete recording

Convert pages 90% cheaper than GPT-6.1 Sol

Document checks passed
8,234 checks ↑
GPT-6.1 Sol (medium reasoning)
GPT-6.1 Sol (medium reasoning) 84.6%
Claude Sonnet 5.5
Claude Sonnet 5.5 84.2%
Mistral OCR 4.1
Mistral OCR 4.1 83.3%
GPT-6 Luna
GPT-6 Luna 80.7%
Claude Haiku 5.5
Claude Haiku 5.5 80.1%
SIE LightOnOCR-3
SIE LightOnOCR-3 73.2%
Cost per 1,000 pages
USD ↓
GPT-6 Luna
$1.01 GPT-6 Luna
Claude Haiku 5.5
$1.24 Claude Haiku 5.5
SIE LightOnOCR-3
$2.05 SIE LightOnOCR-3
Mistral OCR 4.1
$4.00 Mistral OCR 4.1
GPT-6.1 Sol (medium reasoning)
GPT-6.1 Sol (medium reasoning) $21.79
Claude Sonnet 5.5
Claude Sonnet 5.5 $25.42
Evaluation
Tested
olmOCR-Bench: 1,366 pages across 1,068 source families
Scored
Equal-weight text, reading-order, table and math checks across eight categories
Prices
SIE Serverless; provider list prices on recorded usage

Send a page image, get Markdown back

The response is Markdown with HTML tables and image placeholders in entities[0].text. The preview renders the recorded table.

from urllib.request import urlopen
from sie_sdk import SIEClient
​
client = SIEClient(api_key="API keysk-sie-…")
​
image_bytes = urlopen(imagemethomyl-page.pngbrowse).read()
image = {"data": image_bytes, "format": "png"}
result = client.extract(
"modellightonai/LightOnOCR-3-4B",
{"id": "methomyl-page", "images": [image]},
options={"max_new_tokens": 12288, "temperature": 0.1, "top_p": 1},
)
print(result["entities"][0]["text"])
import { unpackMessage } from '@superlinked/sie-sdk';

const imageResponse = await fetch("https://superlinked.com/reference/doc-to-markdown/methomyl-page.png");
if (!imageResponse.ok) throw new Error(`Image returned ${imageResponse.status}`);
const image = new Uint8Array(await imageResponse.arrayBuffer());
const response = await fetch("https://api.superlinked.com/v1/extract/lightonai%2FLightOnOCR-3-4B", {
  method: 'POST',
  headers: {
    Authorization: "Bearer sk-sie-…",
    'Content-Type': 'application/json',
    Accept: 'application/msgpack',
  },
  body: JSON.stringify({
    items: [{ id: "methomyl-page", images: [{ data: Buffer.from(image).toString('base64'), format: "png" }] }],
    params: {"options":{"max_new_tokens":12288,"temperature":0.1,"top_p":1}},
  }),
});
if (!response.ok) throw new Error(`SIE returned ${response.status}`);
const result = unpackMessage<{ items: { id: string; entities: { text: string }[] }[] }>(
  new Uint8Array(await response.arrayBuffer()),
);
const item = result.items[0];
if (result.items.length !== 1 || item?.id !== "methomyl-page" || !item.entities[0]?.text) {
  throw new Error('Invalid OCR response');
}
console.log(item.entities[0].text);
curl --fail --silent --show-error 'https://superlinked.com/reference/doc-to-markdown/methomyl-page.png' -o 'methomyl-page.png'
image_bytes=$(base64 < 'methomyl-page.png' | tr -d '\n')
curl https://api.superlinked.com/v1/extract/lightonai%2FLightOnOCR-3-4B \
  -H "Authorization: Bearer sk-sie-…" \
  -H "Content-Type: application/json" \
  -d "{\"items\":[{\"id\":\"methomyl-page\",\"images\":[{\"data\":\"$image_bytes\",\"format\":\"png\"}]}],\"params\":{\"options\":{\"max_new_tokens\":12288,\"temperature\":0.1,\"top_p\":1}}}"
Build the "Doc to Markdown" 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-3-4B (SIE primitive: /extract). Keep the model id configurable.

Task
- Input: an uploaded image containing text.
- Behaviour: return the text visible in the image
- Fetch the unmodified PNG from https://superlinked.com/reference/doc-to-markdown/methomyl-page.png. Send one POST https://api.superlinked.com/v1/extract/lightonai%2FLightOnOCR-3-4B with item id "methomyl-page" and images [{data: original PNG bytes, format: "png"}]. Preserve params {"options":{"max_new_tokens":12288,"temperature":0.1,"top_p":1}}; keep this model and profile selected and fail when unavailable instead of substituting another model. In Python use SIEClient.extract; TypeScript uses the native REST body and public unpackMessage decoder shown in Copy. Read the transcription from items[0].entities[0].text (Python single-item result["entities"][0]["text"]), without repairing or calculating source values.

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.
Table in model response

METHOMYL 90 SP

CharacteristicSpecificationMethod of analysis
Al, as Methomyl87.5 - 92.5 %High Performance Liquid Chromatography
pH (1 % in water)4.0 - 8.0pH-meter
AppearanceWhite to cream powderVisual

Convert a million pages for $2,050

Self-hosted (Kubernetes)

Your data stays in your cloud, backed by our engineers.

  • Terraform modules for your cloud
  • Apache-2.0, same engine as Serverless
  • GPU workers scale to zero between jobs
  • Separate worker pools for each tenant
Agent prompt Deploy SIE to our AWS account with the superlinked/sie/aws Terraform module. Docs: superlinked.com/docs/deployment.Deploy SIE to our Google Cloud project with the superlinked/sie/google Terraform module. Docs: superlinked.com/docs/deployment.Deploy SIE to our Azure subscription with the superlinked/sie/azure Terraform module. Docs: superlinked.com/docs/deployment.Deploy SIE to our Alibaba Cloud account with the superlinked/sie/alicloud Terraform module. Docs: superlinked.com/docs/deployment.

Run locally

The open-source server on your own machine.

  • NVIDIA GPU
  • One container, no cluster
  • Process your data fully offline
  • Same SDK and model IDs as Serverless
docker run --gpus all -p 8080:8080 ghcr.io/superlinked/sie-server:latest-cuda12-sglang-vision-extract

Switch to SIE in 5 minutes

from mistralai.client import Mistral

page_url = "https://example.com/scanned-page.png"
client = Mistral(api_key="…")
result = client.ocr.process(
    model="mistral-ocr-4-1",
    document={"type": "image_url", "image_url": page_url},
)
print(result.pages[0].markdown)
SIE
from sie_sdk import SIEClient

page_url = "https://example.com/scanned-page.png"
client = SIEClient(api_key="sk-sie-…")
result = client.extract(
    "lightonai/LightOnOCR-3-4B",
    {"images": [page_url]},
    options={"max_new_tokens": 12288, "temperature": 0.1, "top_p": 1},
)
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.