Decisions. Not text.

TL-Decision (Trillion Labs Decision) reads a message, a document or an agent log and answers typed questions: yes/no, pick one, or a score. Every allowed answer gets a calibrated probability. It never writes text, so it can't answer outside the options.

Get TL-Decision-4B Open weights · kev / System One request format

One request.
Every question answered.

Send the state once with as many questions as you need. They share the text but can't read each other's answers.

Request · POST /v1/systemone
{
  "state": "Subject: Site down? ... none of our team can
            log in, the dashboard shows a 502 ...",
  "questions": {
    "urgent": { "type": "noul",
      "instructions": "Does the customer need a reply within the hour?" },
    "team": { "type": "choice",
      "instructions": "Which team should handle it?",
      "criteria": { "outage":  "service down",
                    "billing": "charges, refunds",
                    "feature": "requests, how-to" } },
    "tone": { "type": "score",
      "instructions": "How upset is the customer?",
      "criteria": ["calm", "annoyed", "furious"] }
  }
}
Response shapeIllustrative values

urgentnoul

yes
0.90
no
0.10

teamchoice

outage
0.86
billing
0.03
feature
0.11

tonescore

calm
0.08
annoyed
0.61
furious
0.31

The request is the example from the TL-Decision-4B model card. The probabilities shown illustrate the response shape only; they are not a recorded model output.

Built to be
acted on.

Software can branch on these answers directly. Nothing to parse, nothing to retry.

01

Can't go off-label

A pointer head scores only the options you list. There is no text to generate, so there is no way to answer with something else.

02

Calibrated by default

Each checkpoint ships with a fitted temperature, so 0.9 means roughly 90%. Expected calibration error is 0.018 on transfer-v4.

03

A drop-in endpoint

Same request and response format as TypeSafe's Jev, through the open kev project. Point an existing client at a TL-Decision server.

From generalist
to decider.

Fine-tuning the Trida2.0-4B backbone for typed decisions, scored with kev's own harness.

hard-v1 · 1,083 questions

Long policies, trade-offs, multi-hop

0.867accuracy

The same backbone answering through a prompt scores 0.476.

Trida2.0-4B, prompted 0.476
TL-Decision-4B 0.867

transfer-v4 · 656 questions

Sources it never trained on

0.822accuracy

On par with Kev-4B (0.817), with lower calibration error (0.018 vs 0.042).

Kev-4B 0.817
TL-Decision-4B 0.822

English suites

SuiteTL-Decision-4BKev-4BTrida2.0-4B, prompted
transfer-v4never-trained sources, 656 q0.8220.8170.692
transfer-v9MMLU-Pro, evidence removed, 1,046 q0.784—0.653
decision-v7 †kev's decision distribution, 1,184 q0.8610.8710.751
hard-v1long policies, multi-hop, 1,083 q0.867—0.476
devtools-v1code review, commit, safety, 1,074 q0.745—0.585
documents-v1consumer complaints, 920 q0.891—0.775
SemIfhand-authored, 144 q0.903—0.757

Accuracy on kev's development splits at TL-Decision's shipped temperature (T = 1.823). † Without Banking77 questions with more than 26 options. Kev-4B was scored with the same harness on the same items where shown.

Korean suites, test splits

SuiteTrida2.1-4Bcoming soonTL-Decision-4BKev-4B
KMMLU-Pro2,822 q0.4660.4180.417
CLIcK1,995 q0.6170.5840.572
KorNAT common knowledge6,007 q0.6710.6660.597
KorNAT social values4,000 q0.4470.4850.537
typed-decisions test2,000 q0.7620.6540.666

Trida2.1-4B (coming soon) has its own typed-decision head on a model that also writes text, scored at its fitted calibration temperature. Test items were screened for overlap with training data.

Read these numbers with care.
  • English results are development splits; the locked test splits have not been read for this checkpoint.
  • decision-v7 and hard-v1 training data overlap their development splits (26% and 36% of records under kev's rule). Kev trained on the same data, so the comparison holds, but both scores are flattered.
  • SemIf has 144 questions, so differences under about 3 points are noise.

Serve it on
your machine.

TL-Decision-4B runs on the open kev server and benchmark harness. A single CUDA GPU is enough.

Serve and benchmark
# kev is not on PyPI; install from source (Python 3.12/3.13, uv)
git clone https://github.com/jaredpalmer/kev.git && cd kev
uv sync --extra serve
uv run --extra serve python -m kev.serve \
  --run trillionlabs/TL-Decision-4B --port 8009
# → POST /v1/systemone

uv run python -m kev.benchmark --run trillionlabs/TL-Decision-4B \
  --suite evals/v4/transfer-v4
Call it
curl -s localhost:8009/v1/systemone \
  -H 'Content-Type: application/json' \
  -d '{"state": "Refund still missing after 10 days.",
       "questions": {
         "team": {"type": "choice",
           "instructions": "Which team should handle it?",
           "criteria": {"billing": "charges, refunds",
                        "outage":  "service down"}}}}'

The calibration temperature is stored in head.pt and applied by default. Set KEV_TEMPERATURE=1.0 for raw probabilities. TypeSafe's Python SDK works against the same endpoint.

Need text generation as well? Trida2.1-4B (coming soon) is a Trida model with typed decisions built in: one set of weights writes text and makes typed decisions.

A few details

What is a typed-decision model?

A model that returns a probability for each allowed answer instead of generating text. It is built for the decisions software makes all day: routing, triage, risk scoring, guardrails.

Is TL-Decision the same as Jev?

No. Jev is TypeSafe's hosted model. TL-Decision uses the same request and response format, as implemented by the open kev project, and is not affiliated with TypeSafe.

What is it built on?

Trillion Labs' Trida2.0-4B backbone (Qwen3.5-4B architecture: 32 layers, 24 Gated DeltaNet and 8 full-attention), fully fine-tuned, with a pointer head trained from scratch.

How does it read a request?

Each question becomes its own causal row: the state, the instructions, each option, then a decide token. The head scores each option's hidden state against the decide token, and a softmax over the options gives the probabilities. This is kev's encoding, byte for byte.