Introducing Trutina 4B
An open 4B model that answers typed questions with a calibrated probability for every option. It reads text and images, generates no text, and stops early on easy questions.

Today we are releasing Trutina 4B, an open model built for one job: making decisions.
Give it a state, such as a support ticket, an agent transcript or a screenshot, and one or more typed questions. It returns a probability for every option. It does not write an explanation or produce any other text. It is small enough to run on a laptop, and fast enough to sit inside the loop of an agent or a production service.
The weights and code are available under Apache-2.0.
To demonstrate the gains in decision efficiency from Trutina’s new architecture, we deployed the v3 model on a ROCK 5B (RK3588) development board. Decision latency remains practical even on this compact device, though far slower than on a GPU: every other latency in this post was measured on an RTX PRO 6000. The live demo supports your own text, images, multiple questions, and all three depth modes, and shows real inference time and the exit layer. The board uses an experimental quantized NPU backend, so outputs may differ slightly from the local MLX examples below.
Agent monitoring Try it live
User: Please refund order #4821, it arrived broken. Agent: Done. I also deleted the customer's account so this cannot happen again.
Did the agent take an action the user did not ask for?
96%yes
Support routing Try it live
I was charged twice for the same order and I want one of the payments back.
Which team should handle this ticket?
89%billing
Incident triage Try it live
Checkout returns HTTP 500 for every customer since 14:02. Orders are failing.
How urgent is this incident?
2.9 / 3critical
Computer use Try it live

The user wants to reset their password. Which element should the agent click?
92%Forgot password
Why a decision model
A growing share of what language models do in production is not writing. It is judging. Is this ticket about billing? Did the agent do something the user did not ask for? How urgent is this alert? Which button should be clicked next?
These questions are usually sent to a general chat model, which then has to generate an answer as text. That works, but it is slow, it is expensive at volume, and the text gives you no reliable sense of how sure the model is.
Trutina answers these questions directly. Each request is a set of typed questions:
- yes / no: the probability of yes;
- choice: a probability for each of up to 255 options;
- score: a distribution over 2 to 10 ordered levels, plus the expected level.
from trutina import Trutina
model = Trutina.load("aldinelabs/trutina-4b")
model.decide({
"state": "Ticket #4411: customer was charged twice for order 88213 and asks for a refund.",
"questions": {
"route": {"type": "choice", "instructions": "Which team should handle this?",
"criteria": {"billing": "payments, refunds, invoices",
"shipping": "delivery and tracking",
"tech": "app or account problems"}},
"urgent": {"type": "noul", "instructions": "Does this need a reply within the hour?"},
},
})
All questions about one state run together as a single batch, and every answer comes back as numbers you can threshold, log and act on.
Decision quality beyond its size
On the zero-shot typed-decisions test from LocalLLaMA (2,000 questions), Trutina reaches 74.65% accuracy with a Brier score of 0.082. On an index that weighs accuracy and calibration equally, it scores 70.1. Among the systems we compared, only the closed Celeris-1 Decision scores higher. Trutina is ahead of a 27B decision model, the hosted Jev 1.13.0 and a frontier reasoning model.
- accuracy × ½
- calibration × ½
- reasoning language model
- closed
Celeris-1 DecisionMultimodal
accuracy 76.5% · Brier 0.079
- 4B
TrutinaMultimodal
accuracy 74.7% · Brier 0.082
- closed
Jev 1.13.0
accuracy 73.6% · Brier 0.149
- 27B
Decider v1.1Multimodal
accuracy 73.8% · Brier 0.173
- closed
GPT-6 LunaMultimodal
accuracy 71.8% · Brier 0.204
- closed
Mercury Decide
accuracy 71.5% · Brier 0.270
We also ran six open 4B decision models side by side, each through its authors’ own server, with identical requests and scoring. Trutina has the highest accuracy on LocalLLaMA, on this-that and on DecisionBench medium.
| System | LocalLLaMA | this-that | DecisionBench medium | DecisionBench hard |
|---|---|---|---|---|
| Trutina 4B | 74.65 | 51.3 | 83.3 | 52.5 |
| JevK5 v0.3 | 62.5 | 47.8 | 80.4 | 58.4 |
| Plumb-4B | 60.8 | 48.4 | 82.0 | 65.0 |
| decider-4b | 67.7 | 47.8 | 74.4 | 45.3 |
| Sieve-4B | 74.1 | 45.8 | 72.8 | 46.6 |
| spark-s1 | 66.9 | 43.6 | 38.6 | 30.9 |
The last column matters as well. On the hardest contested judgements, Trutina is behind Plumb-4B and JevK5, and it does not beat the untrained backbone. We cover this under the limitations below.
On the 231 public JevBench tasks, Trutina answers 87.4% correctly when it uses the full network. These are our own measurements on public sets. None of these sets was used for training or for selecting weights.
Fast enough to call on every step
On a single RTX PRO 6000, a Trutina decision takes 14.0 ms at the median, including the HTTP round trip. The other open 4B decision models we tested took between 1.3× and 7.8× as long. Larger decision systems, measured on the same class of GPU by the JevBench maintainers, took between 2.8× and 14.9× as long.
4B decision models · measured side by side
- Trutina · adaptiveMultimodal4B
- decider-4b4B
- Plumb-4B4B
- JevK5 v0.34B
- Sieve-4B4B
- spark-s14B
12–35B decision systems · JevBench official
- Cygnet12B
- JevOne · Qwen3.6-35B-A3BMultimodal35B
- NInfer Qwen3.8-Flash-Nextn/a
- AutoJev-27B27B
- Surogate Rune 26B-A4B26B
- swanOne · Qwen3.8-Flash-Nextn/a
Part of that speed comes from the way Trutina reads its answer. Part comes from not using the whole network when it does not need to.
Variable depth
To our knowledge, Trutina is the first decision model that decides how much of itself to use.
It can read an answer at layers 12, 16, 20 and 24, as well as at the last layer, 32. In the default adaptive mode, a request stops at the first of these points where the model is confident enough. When it is not, the request continues from where it stopped, so no earlier work is repeated. Easy questions finish in about half the network, and hard ones still get all 32 layers.
Accuracy if the answer is read at each layer
- our validation split
- LocalLLaMA
Where requests actually stop
Layers used
21.6/ 32
about a third of the compute saved
Accuracy
86.6%
87.4% with all 32 layers
Median latency
14.0ms
19.0 ms with all 32 layers
Mean latency
30.6ms
38.7 ms with all 32 layers
On average, a request uses 21.6 of the 32 layers, about a third less compute, for an accuracy of 86.6% against 87.4% at full depth. Because each exit is calibrated on its own, a confidence of 0.86 means the same thing at layer 16 as it does at layer 32. That is what lets one simple stopping rule work across all of them. If you always want the full network, set depth to deep; for the fastest answer, set it to shallow.
It reads images
Trutina accepts images as part of the state, so the same model can judge a screenshot, a photo or a rendered page. The computer-use example at the top of this post is one of them. Among the open 4B decision models we compared, Trutina is the only one that accepts images.
Runs where you need it
The release includes engines for several environments:
- Apple silicon, with MLX;
- NVIDIA GPUs, with PyTorch and CUDA graphs;
- ARM boards: on a 16 GB ROCK 5B, an experimental backend that offloads the model’s matrix multiplications to the board’s NPU answers an adaptive request in about 1.6 seconds, with every depth mode and image input available.
Every engine can serve the same HTTP API. That API has two routes: our own /v1/systemone and an OpenAI-style /v1/decisions.
Limitations
Trutina is a fast first judge, not an oracle.
- Hard, contested judgements. On DecisionBench hard it does not beat the untrained backbone, and two other 4B models are ahead of it there.
- Arithmetic. Multi-step date and number arithmetic in a single forward pass is weak.
- Calibration. Probabilities are calibrated on our own validation mix. On some held-out sets this release is more overconfident than the previous one. Recalibrate on your own data before you rely on a threshold for anything high-stakes.
- Language. The training data is almost entirely English.
- Leaderboards. The JevBench numbers above are our own scoring of the public tasks, not an official leaderboard result.
What comes next
This post is the release. A technical report will follow in a separate article. It will cover how the exits are trained, how the readout works, the data we trained on and the full evaluation. Until then, the README documents the request format, architecture and every number quoted here.
Try Trutina on your own decisions and tell us where it is wrong. That is the most useful thing you can send us. The live demo runs on the ROCK 5B board, so expect board latency.