NewKrites-2: level with Jev on Typed Decisions. Open weights from 2B at launchSee the results →
Empsychia · Krites-2

AI that knows how sure it is.

Decision models that return a calibrated probability for every question you ask, in one call that writes no text. Built for agents and workflows that need to know when to hand a case to a person.

72.2%Typed Decisions, level with Jev at 72.7%public benchmark · 27B
0.014Calibration error on held-out scenariosour test set · all four models ≤ 0.018
6×Faster: 32 questions in one pass, not 32 callssame model · research build
2B–27BFour models; 2B and 4B ship as open weightsApache-2.0 · at launch
POST /v1/decide
Inputsupport ticket

Outputillustrative
Read-outcut-off 0.80
3questions
1forward pass
0words generated
One ticket, three typed questions, one call. Tap a sentence to take it out.Illustrative values, not model output
Results · Krites-2 technical report

Level with Jev. Built in the open.

On the public Typed Decisions benchmark, Krites-2-27B answers 72.2% of cases correctly, against 72.7% for TypeSafe's closed Jev 1.13.0, a gap well inside the margin of error. No request contains examples. The corpus, the report, the two smaller models and the code are released at launch.

Typed Decisions benchmark, accuracy
Zero-shot. Higher is better. Hover a bar for details.
Krites-2Other systems and the prior

Public Typed Decisions leaderboard, revision 7189f46. Five listed systems score above Jev; the top one is shown. Jev 1.13.0 is maintainer-measured and Krites-2 rows are from our report. The prior ignores the input.

The Krites-2 family
Held-out test set: questions on scenarios that share nothing with training.
ModelBaseAccessAccuracyBrier
Krites-2-2BQwen3.5-2BApache-2.089.2%0.142
Krites-2-4BQwen3.5-4BApache-2.091.7%0.111
Krites-2-9BQwen3.5-9BAPI92.5%0.099
Krites-2-27BTernary Bonsai 2API93.9%0.085

9,843 test questions (4,930 for 27B). Brier score: lower is better. Each model trains a LoRA adapter and a small read-out head, 18–113M parameters in all.

One pass

Ask 32 questions. Read the state once.

A chat model writes each answer one token at a time, as text you then parse. Krites reads the state once, shares it across every question and scores them all from the same pass. Extra questions cost almost nothing.

  • Every answer is a full distribution over the options you defined
  • Typed output: choice, score or yes/no, with no JSON to repair
  • Options and rubrics are text at run time, so a new task needs no retraining
32 questions about one 680-token ticket
Krites, one shared pass223 ms
The same model, one pass per question1,328 ms
6×less time for the same 32 answers, and the gap widens as you add questions

Measured with the Krites framework on Qwen2.5-1.5B and one RTX 3090.

Calibration

Set the threshold. Know the cost.

When 0.9 means right nine times in ten, a threshold is a business decision you can price in advance: how much you automate, how often it is wrong and how much goes to a person.

  • Temperatures fitted per question type and option count
  • Calibration error and Brier score reported for every model
  • Recalibrate on a few hundred of your own labels
Confidence of 4,930 held-out answers · Krites-2-27B
0.300.651.00
–automated
–wrong among automated, – predicted
–sent to a person

Real predictions on the held-out test set, with the hard-label temperatures from the technical report. Bar height is the square root of the count.

APIs

Decisions first. The same engine, further.

Decisions is the API we launch first, because it has the results to back it. Map and Opinions run on the same calibrated read-out and ship when they pass their own evaluation.

What should happen?
Launching first

Krites Decisions

POST/v1/decide

Send a state, such as an agent's proposed tool call, a ticket or an email, and typed questions about it. Get a calibrated probability for every option, and set the cut-off at which your software acts on its own.

  • Agent guardrails. Should this tool call run, wait for approval or be blocked?
  • Ticket triage. Which team, how urgent, and is the customer about to leave?
  • Moderation and routing. Any yes/no, choice or score question you can write down.

Speaks the same wire format as Jev, so moving over is a change of base URL.

Where does this belong?
Next

Krites Map

Walks your own taxonomy, given as text, with a probability at every level, and stops where it is unsure.

How will people respond?
Next

Krites Opinions

Estimates how a defined group would answer a question, with calibrated uncertainty, scored against real survey data.

A real request

Questions in. Probabilities out.

You write the questions and their options as plain text when you call the API. This is a real response from Krites-2-4B, taken from the technical report. Note the last line: no text was generated.

Request
POST /v1/decide
{"model": "Krites-2-4B",
 "state": "Ticket #4821: card charged twice for order 1193,
           customer asking for a refund today.",
 "questions": {
   "team": {"type": "choice",
     "instructions": "Which team should handle this?",
     "criteria": {"billing": "payments, refunds, charges",
                  "shipping": "delivery issues",
                  "technical": "app or account errors"}},
   "urgency": {"type": "score",
     "instructions": "How urgent is this?",
     "criteria": ["can wait", "this week", "today", "immediately"]},
   "refund": {"type": "noul",  # yes/no
     "instructions": "The customer is asking for a refund."}}}
Response · Krites-2-4B
{"model": "Krites-2-4B",
 "answers": {
   "team": {"choice": "billing", "confidence": 0.98,
     "probabilities": {"billing": 0.98, "shipping": 0.01,
                       "technical": 0.01}},
   "urgency": {"score": 2.03, "confidence": 0.85,
     "probabilities": {"0": 0.0, "1": 0.04, "2": 0.89,
                       "3": 0.07}},
   "refund": {"noul": 0.98, "confidence": 0.96,
     "probabilities": {"false": 0.02, "true": 0.98}}},
 "usage": {"input_tokens": 362, "output_tokens": 0}}
Build log

Six weeks from first commit.

One founder, self-funded. The corpus, the training recipe, the kernels and the serving stack were all built in house.

6weeks
From first commit to four models and a technical report
1.25M
Typed decisions in the Krites-2 corpus
131
Domains, in 17 languages
174
Single-GPU hours to build the corpus
  1. First commit

    A PyTorch framework that turns any open language model into a typed decision model.

  2. Krites-1

    1.08M typed decisions and the first models, including a 27B flagship on a ternary base.

  3. Audit-driven rebuild

    Every scenario is now drafted with its own questions. In an audit, questions that fit their scenario rose from 77.2% to 93.2%.

  4. Krites-2

    1.25M decisions in 174 single-GPU hours. Four models, 2B to 27B, within a point of Jev.

Open source

Use the API, or run it yourself.

At launch the framework ships under Apache-2.0 and the corpus under CC-BY. Serve an open model on your own GPU and keep your data on your own machine. The hosted APIs speak the same wire format.

  • A PyTorch library and command-line tool, installed with pip
  • A shared model is an adapter and a head: megabytes, not gigabytes
  • Train your own from a Kritesfile and share it on the hub

# any open LLM, zero-shot
import krites as kr

model = kr.from_llm("Qwen/Qwen3.5-2B")
d = model.decide(ticket, {
    "department": kr.Choice("Which team?", teams),
    "urgency":    kr.Score("How urgent?", levels),
    "churn_risk": kr.Noul("Do they threaten to cancel?"),  # yes/no
})
d["churn_risk"].noul   # P(yes), e.g. 0.86

# serve locally, same wire format as the API
$ krites serve
Why now

Models now act. They need to know when not to.

Every team putting a model in a workflow meets the same question: which answers can run on their own, and which need a person? A probability you can trust answers it.

Agents

Models take actions

Models now approve refunds, route tickets and call tools. Each step is a decision, and a wrong one costs money.

Text

A string has no threshold

A chat model's answer is text. The confidence it states is not a probability you can set a policy on.

Oversight

Review is becoming law

Article 14 of the EU AI Act requires human oversight of high-risk systems. A calibrated threshold decides which cases a person sees.

Funding

We are raising a seed round.

Empsychia is self-funded to date. The round takes the APIs to market and pays for larger models and human-response data. The deck is below; the technical report and our evaluations are available on request.

Harnick Khera

Founder

Machine-learning researcher and first author at WASPAA 2025. Built Krites end to end: the corpus, the training recipe, the kernels and the serving stack. Google Scholar

Design partners

Teams with a decision, survey or classification problem and real outcomes to test against: hello@empsychia.com.

Early access

Get early access to the API.

We are opening the APIs to a small group of teams first. Tell us what you would decide with it, and the founder will be in touch about access.