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

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 page
QUERY

What is the 2026 SEMIMONTHLY standard withholding for Married Filing Jointly with adjusted wages of $1,000?

1 · Page 20IRS Publication 15-T · 2026
SEMIMONTHLY Payroll Period
Table header with Married Filing Jointly and Standard withholding columns
Table excerpt
Wage bracket $995 to $1,010; Married Filing Jointly standard withholding $0

Excerpt from the first of 8 ranked pages. Recorded query

OCR plus OpenAI embeddings returns the wrong page

Better than Voyage multimodal‑3.5 for 81% less, level with Cohere Embed v5 Pro for 72% less

Ranking quality against price
1,816 questions
Page ranking quality (ViDoRe v3, of 100) ↑ Price per 1,000 pages →
ViDoRe v3 page ranking quality (nDCG@10, of 100) on 1,816 questions, against the real-time price per 1,000 pages indexed
ModelPage ranking quality (ViDoRe v3, of 100)Price per 1,000 pages
SIE Tomoro ColQwen3 4B64.1$0.20
Cohere Embed v5 Pro64.8$0.74
Voyage multimodal-3.561.0$1.11
OCR + OpenAI embeddings56.0$1.57
PDF page search on public documents

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 Path
from urllib.request import urlopen
from sie_sdk.scoring import maxsim
from sie_sdk import SIEClient
​
client = 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.
Output
Caller-side MaxSim rankingTop 5 of 8
1 · Page 2028.177 MaxSim
SEMIMONTHLY Payroll Period
Table header with Married Filing Jointly and Standard withholding columns
Table excerpt
Wage bracket $995 to $1,010; Married Filing Jointly standard withholding $0
  1. 2 IRS Publication 15-T, page 17
    Page 1726.029 MaxSim
  2. 3 IRS Publication 15-T, page 18
    Page 1825.723 MaxSim
  3. 4 IRS Publication 15-T, page 19
    Page 1925.561 MaxSim
  4. 5 IRS Publication 15-T, page 15
    Page 1525.544 MaxSim

Index a million PDF pages for $200

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

Switch to SIE in 5 minutes

import voyageai
from PIL import Image

client = voyageai.Client()
model = "voyage-multimodal-3.5"
page = client.multimodal_embed(
    [[Image.open("page.png")]], model=model, input_type="document",
).embeddings[0]
query = client.multimodal_embed(
    [[question]], model=model, input_type="query",
).embeddings[0]
SIE
from pathlib import Path
from sie_sdk import SIEClient
from sie_sdk.scoring import maxsim

client = SIEClient(api_key="sk-sie-...")
model = "TomoroAI/tomoro-colqwen3-embed-4b:compact"
# Re-index your pages with the new model.
page = client.encode(
    model, [{"images": [Path("page.png").read_bytes()]}], is_query=False,
)[0]["multivector"]
query = client.encode(model, [{"text": question}], is_query=True)[0]["multivector"]
score = maxsim(query, [page])[0]

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.