Better page search than Voyage multimodal‑3.5, for 81% less
SIE runs open-source document search models behind one API. Search PDFs, slides and scanned reports straight from the page images, tables and charts included, with no OCR step to break.
SIE Tomoro ColQwen3 4B
Right pageWhat is the 2026 SEMIMONTHLY standard withholding for Married Filing Jointly with adjusted wages of $1,000?
Excerpt from the first of 8 ranked pages. Recorded query
OCR plus OpenAI embeddings returns the wrong page
OCR + OpenAI text-embedding-3-large
Wrong page firstHow much did the amount of JP Morgan Chase's total asset management fee increase from 2023 to 2024?
Client assets, not fees. The answer page came 4th.
JPMorgan Chase 2024 Form 10-KOCR + OpenAI text-embedding-3-large
Wrong page firstWhat was Romania’s employment rate for people aged 15 to 24 in 2020?
No figure for 2020 on this page. The answer page came 76th.
European Commission, Labour market and wage developments in Europe 2024 (CC BY 4.0)- arXiv:2412.02592 ICCV 2025 None of the OCR tools tested produced text good enough for a reliable RAG index
OCR Hinders RAG: Evaluating the Cascading Impact of OCR on Retrieval-Augmented Generation
“none is competent for constructing high-quality knowledge bases for RAG systems”
Better than Voyage multimodal‑3.5 for 81% less, level with Cohere Embed v5 Pro for 72% less
| Model | Page ranking quality (ViDoRe v3, of 100) | Price per 1,000 pages |
|---|---|---|
| SIE Tomoro ColQwen3 4B | 64.1 | $0.20 |
| Cohere Embed v5 Pro | 64.8 | $0.74 |
| Voyage multimodal-3.5 | 61.0 | $1.11 |
| OCR + OpenAI embeddings | 56.0 | $1.57 |
1,816 questions across 11,624 pages of public reports, filings and slides (ViDoRe v3)
- Scored
- Human relevance grades; nDCG@10, 100 is perfect
- Prices
- Real-time list prices, each at the page render its score came from
Encode the page once. Search it by text.
from pathlib import Pathfrom urllib.request import urlopenfrom sie_sdk.scoring import maxsimfrom sie_sdk import SIEClientclient = SIEClient(api_key="API keysk-sie-…")model = "modelTomoroAI/tomoro-colqwen3-embed-4b:compact"query = "queryWhat is the 2026 SEMIMONTHLY standard withholding for Married Filing Jointly with adjusted wages of $1,000?"pages = [ "irs-p15t-page-13.png", "irs-p15t-page-14.png", # Copy and Run include all 8 pages.]# Pinned image-loading setup omitted; Copy includes it.q = client.encode( model, [{"text": query}], output_types=["multivector"], is_query=True,)[0]["multivector"]docs = client.encode( model, [{"images": [image]} for image in images], output_types=["multivector"], is_query=False,)# Native output is per-token vectors; your code ranks the pages.scores = maxsim(q, [doc["multivector"] for doc in docs])for i in sorted(range(len(pages)), key=lambda i: -scores[i]): print(f"{scores[i]:.3f} {pages[i]}")import { readFile } from 'node:fs/promises';
import { SIEClient } from '@superlinked/sie-sdk';
const client = new SIEClient(undefined, { apiKey: 'sk-sie-…' });
const model = 'TomoroAI/tomoro-colqwen3-embed-4b:compact';
const query = "What is the 2026 SEMIMONTHLY standard withholding for Married Filing Jointly with adjusted wages of $1,000?";
const pages = [
"irs-p15t-page-13.png", "irs-p15t-page-14.png",
// Copy and Run include all 8 pages.
];
// Pinned image-loading setup omitted; Copy includes it.
const [q] = await client.encode(
model, [{ text: query }],
{ outputTypes: ['multivector'], isQuery: true },
);
const docs = await client.encode(
model, images.map((image) => ({ images: [image] })),
{ outputTypes: ['multivector'], isQuery: false },
);
// Native output is per-token vectors; your code ranks the pages.
const dot = (a: Float32Array, b: Float32Array) => a.reduce((s, x, i) => s + x * b[i]!, 0);
const maxsim = (qv: Float32Array[], dv: Float32Array[]) =>
qv.reduce((sum, qt) => sum + Math.max(...dv.map((dt) => dot(qt, dt))), 0);
const ranked = pages
.map((page, i) => ({ page, score: maxsim(q!.multivector!, docs[i]!.multivector!) }))
.sort((a, b) => b.score - a.score);
console.log(ranked);page_0=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-13.png' | base64 | tr -d '\n')
page_1=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-14.png' | base64 | tr -d '\n')
page_2=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-15.png' | base64 | tr -d '\n')
page_3=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-16.png' | base64 | tr -d '\n')
page_4=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-17.png' | base64 | tr -d '\n')
page_5=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-18.png' | base64 | tr -d '\n')
page_6=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-19.png' | base64 | tr -d '\n')
page_7=$(curl --fail --silent --show-error --location 'https://huggingface.co/datasets/superlinked/sie-task-evidence/resolve/74f4e0eb2676a95b625783932796edac12040644/task-visual-examples-2026/irs-p15t-page-20.png' | base64 | tr -d '\n')
curl https://api.superlinked.com/v1/encode/TomoroAI%2Ftomoro-colqwen3-embed-4b%3Acompact \
-H "Authorization: Bearer sk-sie-…" \
-H "Content-Type: application/json" \
-d "{\"items\":[{\"text\":\"What is the 2026 SEMIMONTHLY standard withholding for Married Filing Jointly with adjusted wages of \$1,000?\"}],\"params\":{\"output_types\":[\"multivector\"],\"options\":{\"is_query\":true}}}"
curl https://api.superlinked.com/v1/encode/TomoroAI%2Ftomoro-colqwen3-embed-4b%3Acompact \
-H "Authorization: Bearer sk-sie-…" \
-H "Content-Type: application/json" \
-d "{\"items\":[{\"images\":[{\"data\":\"$page_0\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_1\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_2\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_3\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_4\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_5\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_6\",\"format\":\"png\"}]},{\"images\":[{\"data\":\"$page_7\",\"format\":\"png\"}]}],\"params\":{\"output_types\":[\"multivector\"],\"options\":{\"is_query\":false}}}"Build the "Visual document search" 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: TomoroAI/tomoro-colqwen3-embed-4b:compact (SIE primitive: /encode). Keep the model id configurable.
Task
- Input: a text query plus one or more document page images.
- Behaviour: return document pages ranked by late-interaction relevance to the query
- 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.
- 2
Page 1726.029 MaxSim - 3
Page 1825.723 MaxSim - 4
Page 1925.561 MaxSim - 5
Page 1525.544 MaxSim
Index a million PDF pages for $200
Serverless API
We host the models; you call one API.
- No idle GPUs, pay for what you use
- SOC 2 Type 2, US or EU data residency
- $50 of credit to start, no card required
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-default