LiquidAI d1-3B is a 3B image-text model that has picked up 10,843 downloads since its October 7 release, and plenty of those people will be surprised when they load it. There is no way to ask it for a caption. It has no text output at all, and every response reports "output_tokens": 0.
Liquid calls d1-3B a "decision model". It reads text, JSON and images, then answers questions you define up front (yes/no, pick one, or score on a scale) in a single forward pass. It never writes a sentence. If you came looking for a pocket Qwen-VL or Gemma to caption your camera roll, this is the wrong download. If you've ever spent a 7B chat model's tokens on a yes/no question, it might be exactly what you need.
What d1-3B actually is
Liquid AI released Open d1 on October 7, 2026. There are two models: d1-3B (text + image) and d1-omni-600M (text + image or text + audio, labelled experimental).
The specs from the model card:
| d1-3B | |
|---|---|
| Parameters | 3.12B |
| Vision encoder | SigLIP2 NaFlex shape-optimized, 400M |
| Context length | 32,768 tokens |
| Vocabulary | 128,000 |
| Weights | Safetensors, BF16 |
| Base model | LFM2.5-VL-3B (text backbone averaged with LFM2.5-2.6B) |
| License |
lfm1.0 (LFM Open License) |
The architecture is LFM2.5-VL-3B's. The difference from earlier LFMs is what Liquid did to the weights and what comes out the other end. According to the blog post, they averaged LFM2.5-2.6B's weights with the VL model's text backbone, fine-tuned several checkpoints with different seeds and data mixes, and merged them. Liquid's own takeaway is pleasantly unglamorous: training on long inputs, shuffling answer options and fixing data shortcuts mattered more than any clever technique.
Three question types, zero output tokens
You ask questions, and each one has a type:
| Type | What you get back |
|---|---|
noul |
P(yes) |
choice |
chosen option, confidence, per-option probabilities |
score |
expected level on a 2–10 step ordinal scale, confidence, probabilities |
Several named questions can share one "state" (your ticket, document, image) and get answered in the same pass. The return shape is {"answers": {...}, "usage": {"input_tokens": n, "output_tokens": 0}}.
For a router, a moderation filter or an agent guardrail, this is the API I actually wanted. You get probabilities back and never have to parse a malformed JSON blob from a chat model that decided to add "Sure! Here's your answer:" in front. The model card calls the answers "calibrated". Whether they are well calibrated is another matter: Liquid doesn't publish calibration error for d1, and one review names calibration error as the obvious open question, one you'll have to measure yourself.
Benchmarks: where Qwen-VL and Gemma are missing
I went looking for d1-3B vs Qwen2.5-VL-3B or Gemma at the same size. Liquid doesn't publish one. It compares d1-3B against other decision models and against its own backbone.
On the Decision Index v0.2.1 (public split), d1-3B scores 48.57. That's the top sub-10B result in their table, behind Winnow-12B (50.02) and ahead of Decider 35B-A3B (47.11). The other rows come from the public leaderboard, but Liquid ran the official scorer on d1-3B itself instead of submitting it, so read it accordingly.
Text tasks, from the blog:
| Benchmark | d1-3B | Decider 4B | Decider 2B |
|---|---|---|---|
| SQuAD 2.0 | 85.3 | 76.0 | 67.7 |
| Civil Comments | 93.0 | 92.8 | 93.6 |
| MASSIVE intent | 87.3 | 88.3 | 81.1 |
| PubMedQA | 66.0 | 63.3 | 65.7 |
| BoolQ | 86.7 | 89.0 | 87.3 |
| XNLI | 85.0 | 88.6 | 85.0 |
| PAWS-X | 76.9 | 69.8 | 59.5 |
| Mean | 82.9 | 81.1 | 77.1 |
The 4B model wins BoolQ, XNLI and MASSIVE. The model card's version of this table adds HelpSteer2, where d1-3B scores 36.7 to Decider 4B's 42.0, and with that row included the means shrink to 77.1 vs 76.2, which is a narrow win. The Knowledge category on the Decision Index is a weak 23.8, so don't expect it to know facts; it judges what you hand it.
The vision numbers are a bit awkward. Across 11 image benchmarks the card reports a mean of 74.1 for d1-3B vs 73.9 for LFM2.5-VL-3B, so turning the model into a decision engine barely moved average vision quality. The per-benchmark breakdown is uneven, though:
| Benchmark | d1-3B | LFM2.5-VL-3B |
|---|---|---|
| VL-RewardBench | 65.0 | 50.9 |
| MMVP | 77.0 | 73.7 |
| CV-Bench | 82.1 | 87.6 |
| VisualWebBench | 71.4 | 78.3 |
| POPE | 88.5 | 90.1 |
It's much better as a visual judge (+14.1 on VL-RewardBench) and noticeably worse at spatial reasoning and reading web screenshots. If your plan was "check whether this UI screenshot shows an error dialog", the 6.9-point drop on VisualWebBench should give you pause. Liquid's blog says it validated vision on standard public benchmarks, and that the Decision Index v0.3 private vision split is not reported in this release.
I don't think leaving out Qwen-VL and Gemma is an attempt to hide something. Those are generative models and the comparison doesn't map cleanly. It does leave you to figure out yourself whether a 3B classifier beats prompting a VLM you already run. Build a 200-example eval from your own data before switching.
The license says "open". Read the fine print
The blog says you can download, fine-tune and deploy "without restrictions". The Hugging Face tag says lfm1.0, which is the LFM Open License v1.0. It's based on Apache 2.0 with one big change: commercial rights end once your company's annual revenue passes $10 million USD, after which you need a paid license from Liquid. That limit also applies to fine-tuned derivatives. There's no copyleft, so your fine-tunes can stay closed.
For indie devs and most startups this is a non-issue. For anyone at a company of real size, "without restrictions" is the wrong phrase, and I wish Liquid had skipped it.
GGUF sizes and latency: RTX 4090, M5 Pro, Jetson
Liquid doesn't publish RAM or VRAM numbers. The official GGUF repo gives you file sizes, which are a decent lower bound:
| Quant | Size |
|---|---|
| Q4_K_M | 1.67 GB |
| Q8_0 | 2.87 GB |
| BF16 / F16 | 5.4 GB |
Q4_K_M fits comfortably on a laptop and, on paper, on a recent phone. Note that Liquid's own speed table has no phone in it.
Published latency (single request):
| Device | 1 question | 384px image | Packed throughput |
|---|---|---|---|
| RTX 4090 (bf16) | 8 ms | 17 ms | 475 states/s |
| Apple M5 Pro (MPS) | 30 ms | 62 ms | 78 states/s |
| Jetson AGX Orin 64GB | 26 ms | 83 ms | 110 states/s |
| Jetson Orin Nano | 50 ms | 202 ms | 38 states/s |
The 4090's 8 ms figure assumes model.compile(mode="reduce-overhead"); without it the card says 16 ms. A 3.4k-token state takes 640 ms on the M5 Pro and 1,640 ms on the Orin Nano, so long documents cost real time even with no decoding.
How to run d1-3B locally
Transformers
You need 5.14 or newer and trust_remote_code=True:
pip install "transformers>=5.14" torch torchvision pillow
import torch
from transformers import AutoModel
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
dtype = torch.float32 if device == "cpu" else torch.bfloat16
model = AutoModel.from_pretrained("LiquidAI/d1-3B", trust_remote_code=True, dtype=dtype).to(device)
# then: model.system_one(state, questions, images=None)
# or: model.system_one_batch([(state, questions[, images]), ...])
llama.cpp
Liquid claims day-one support. The GGUF card's quick start pulls the Q8_0 file; swap the tag for Q4_K_M if you want the 1.67 GB one:
llama-server -hf LiquidAI/d1-3B-GGUF:Q8_0
Then POST to /v1/systemone with state (or null for image-only), optional base64 images, and a questions object. The text example from the card:
curl http://127.0.0.1:8080/v1/systemone -H "Content-Type: application/json" -d '{
"state": "I was charged twice this month, please refund one of them.",
"questions": {
"refund": {"type": "noul", "instructions": "Is the customer asking for a refund?"},
"team": {"type": "choice", "instructions": "Which team should handle this?",
"criteria": {"billing": "Charges, refunds, invoices", "technical": "App or site faults",
"fraud": "Suspected unauthorised use"}},
"urgency": {"type": "score", "instructions": "How urgent is this?",
"criteria": ["Can wait", "Today", "Blocking the customer now"]}
}
}'
This isn't /v1/chat/completions, so your existing OpenAI-client code won't just work. The GGUF page doesn't say which llama.cpp build you need, so update first.
vLLM, SGLang, Docker
Hugging Face's "Use this model" panel offers vLLM, SGLang and docker model run hf.co/LiquidAI/d1-3B snippets, but those are generated by the Hub. Neither the model card nor the blog mentions them, and given the custom system_one API I'd test before trusting them.
MLX
The model card, GGUF card and blog don't mention MLX at all. On a Mac today, your options are PyTorch on MPS (where Liquid's M5 Pro numbers come from) or llama.cpp with Metal.
Who should actually download it
Grab it if you're building a router, a content filter, an agent guardrail, a reranker, or a camera pipeline that needs a yes/no on every frame. Skip it if you need captions, OCR output, or anything you'd show to a user as text. For those, a generative VLM is still the tool, and nothing Liquid published says d1-3B competes there.
I think "a vision model that can't talk" is the most useful thing Liquid has shipped this year, because most production VLM calls I've seen are classifiers dressed up as chat. What would you build with a 3B vision model that runs fully offline and only answers the questions you give it? And would you trust its confidence scores without calibrating them yourself first?
Top comments (0)