Back to writing

How I Think Jev Works, and Why ‘Just a Classifier’ Misses the Point

How I think Jev makes decisions using broad LLM-like knowledge, and where its speed could come from.

I keep seeing Jev described as “just a classifier.” People are sharing their own versions too. I get the comparison. The output is a choice or a score.

What I care about is the knowledge behind that output. Reading a support ticket, applying a refund policy, and checking an agent’s work can all end in a label. Getting that label right can require very different understanding.

My guess is that Jev combines a capable general model with training and serving built for decisions. I don’t know its internals. But there is a fairly concrete way to think about how this could work.

What you send, what you get back

Take an email: “Can we move our demo to Tuesday?” Your app needs to decide where it goes. Send the email, your routing rules, and the allowed queues. Jev returns a typed answer with probabilities. TypeSafe’s API has three ways to ask:

ChoiceAn allowed option and its probability distribution.
NoulA yes/no probability.
ScoreA result over ordered levels, with their distribution.

The rules go in the request. The current model accepts text and structured state. For browser use, the client needs to turn the page into text or structured data first; Jev does not take the screenshot directly.

What I mean by general-purpose

We had BERT, DeBERTa, GLiNER, and task-specific classification heads long before Jev. There was already plenty you could do with them:

BERT & DeBERTaStart with a pretrained encoder and adapt it to the job. Classification, question answering, and language inference were all possible.
Fine-tuned headsTrain a head for the labels your application needs. If the task stays stable, that can be all you need.
GLiNERTell it which entity types to find at runtime. It can handle unseen types too. That flexibility existed before Jev.
JevThe pitch is one model for different judgments. Send the rules and choices with the request; get a typed answer and probabilities back.

Say the customer bought an item 20 days ago. A 30-day return policy and a 14-day policy should produce different answers. The purchase and the labels have not changed. Only the rule has.

FIG. 01Change the rule in the request
Change the rule in the requestHypothetical return policies and expected answers. This illustrates request-time rules, not a recorded model result.Same purchase20 days · unused30-day policyrule in request A14-day policyrule in request BEligible20 ≤ 30Outside window20 > 14The rule changes in the request.Change the rule in the requestHypothetical return policies and expected answers. This illustrates request-time rules, not a recorded model result.Same purchaseexample20 days ago · unused item30-day policyrule in request A14-day policyrule in request BEligible20 ≤ 30Outside window20 > 14Same state. Different supplied rule.
Hypothetical return policies and expected answers. This illustrates request-time rules, not a recorded model result.

By general-purpose, I mean broad LLM-like knowledge and understanding. Being able to accept new labels is useful, but the model also has to understand the thing it is judging. A refund policy is one task. Working out whether an agent actually fixed a bug is another.

Why I suspect a general model underneath

A head trained to separate “billing” from “support” has a defined job. Ask about an agent’s work and it needs something else: what the task meant, what the tools did, and whether the result is enough. That is the kind of understanding I would expect from a general model.

The path I have in mind looks like this:

TypeSafe describes a new architecture, a parallel sampler, and Reinforcement Learning for Calibrated Decisions (RLCD). It has not disclosed how the scoring works. So the diagram above is my proposed mechanism, not a reconstruction of their model.

You can read the scores and stop

Give each candidate answer a letter: A, B, C, D. Run the input through the model and look at the scores for those letters at the first output position. Normalize those scores over the four candidates. You have a distribution without generating a written explanation.

That is one way to implement it. I don’t know whether Jev uses option-letter logits. A learned decision head or a different joint scoring design could give you the same API.

A distribution can be the answerIllustrative options and scores
image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ 0 25 50 75 100 Illustrative probability (%) A B C D 4% 3% 91% 2% image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ 0 25 50 75 100 Illustrative probability (%) A B C D 4% 3% 91% 2%

A possible readout, not measured Jev probabilities.

The reading still happens. The model has to process the instructions and the state. You are stopping once you have the scores you need.

Where the speed could come from

A text-generating model reads the input, then produces output one step at a time. The KV cache lets it reuse earlier attention state. It still has to do the work for each new token. If all the app needs is a choice, the scoring approach above can skip those extra steps.

The possible saving is in the output steps. Reading a long input can still take time.

Read once. Stop when you have the choice.
ChooseRead the inputReturn the choice
WriteRead the inputGenerate text
one token after another

Both paths read the input. Generating a written answer adds more steps. This is a sketch of the proposed design, not a Jev benchmark.

There is more to it than stopping early. TypeSafe documents reading shared state and evaluating questions in parallel. Sending several separate one-token requests would not, by itself, reproduce that behavior.

FIG. 02One state, several focused questions
One state, several focused questionsA conceptual view of TypeSafe’s documented shared-state API. It does not depict the hidden model architecture or guarantee constant latency.One shared statemessage + account contextChoiceWhich queue?option + probabilitiesNoulEscalate?yes / no probabilityScoreHow urgent?ordered-level resultOne state, several focused questionsA conceptual view of TypeSafe’s documented shared-state API. It does not depict the hidden model architecture or guarantee constant latency.One shared statemessage + account contextChoiceWhich queue?option + probabilitiesNoulEscalate?yes / no probabilityScoreHow urgent?ordered-level result
A conceptual view of TypeSafe’s documented shared-state API. It does not depict the hidden model architecture or guarantee constant latency.

I would look closely at the probabilities

I suspect a lot of the work is in training. A model can choose the right answer and still be much too sure of it. If your app uses the probability to decide whether to ask a person, that matters.

Same winner, different confidenceSoftmax of example scores at two temperatures
image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ A B C D Same illustrative scores; C stays the winner 0 25 50 75 100 Probability (%) T = 1 T = 2 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ A B C D Same illustrative scores; C stays the winner 0 25 50 75 100 Probability (%) T = 1 T = 2

A mathematical illustration. Neither temperature is a reported Jev setting, and softer scores do not by themselves prove calibration.

Temperature scaling shows how the probabilities can change while the winning answer stays the same. This is an example, not Jev’s disclosed calibration method. TypeSafe says it trains with RLCD and derives the confidence field from the distribution. It also tells you to validate thresholds on your own data.

Then you put it in a loop

Returning an allowed value only solves the format problem. The answer can still be wrong:

FIG. 03Valid JSON can still contain the wrong decision
Valid JSON can still contain the wrong decisionA hypothetical error, not a Jev test result. Output constraints and decision correctness require different checks.Policy: 30-day returnspurchase: 45 days agoHypothetical result: approveValid type?Yes, “approve” is allowed.Correct decision?No, the policy is not met.A valid output shape does not establish a correct judgment.Valid JSON can still contain the wrong decisionA hypothetical error, not a Jev test result. Output constraints and decision correctness require different checks.Policy and stateexampleReturn window: 30 daysPurchase: 45 days agoReturned: approvea hypothetical wrong answerValid type?YesCorrect decision?No“Approve” is allowed by the schema.The purchase is outside the policy.The application still has to verify.
A hypothetical error, not a Jev test result. Output constraints and decision correctness require different checks.

The app takes that answer, runs the action, and checks what happened. Then it sends the next state.

01 · APPLICATIONObserve

State and allowed actions

02 · MODELDecide

Typed answer and probabilities

03 · APPLICATIONAct

Execute, then verify

Repeat that enough times and small differences in accuracy start to add up:

Small decision errors accumulateIllustrative model: independent steps, no recovery
image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ 1 5 10 15 20 Required correct decisions 0 25 50 75 100 All steps correct (%) 35.8% 66.8% 95% correct per step 98% correct per step image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ 1 5 10 15 20 Required correct decisions 0 25 50 75 100 All steps correct (%) 35.8% 66.8% 95% correct per step 98% correct per step

Calculated as p raised to the number of steps. Not measured agent performance.

This calculation assumes independent errors and no retries or recovery. A real agent can get stuck on the same mistake or recover from an earlier one. Don’t read these numbers as Jev’s expected success rate.

What I would use it for

Browser Use + Jev

Gregor Zunic’s flight-search demo. Jev selects an operation and page target; a separate model supplies text to type. The timing shown belongs to this demo. Original tweet ↗

json-render + Jev

Chris Tate’s experiment with json-render and Jev. The app supplies the components, actions, and design system. This recording shows his comparison, not my benchmark. Original tweet ↗

Browser agents: Choose the next operation and DOM target. The browser executes it.

Browser agents

Choose the next operation and DOM target. The browser executes it.

Jev Ultrafast ↗
Generative UI: Pick a component from a catalog. The app renders it with its own data.

Generative UI

Pick a component from a catalog. The app renders it with its own data.

Instinct UI demo ↗
Email triage: Label a scheduling request and put it in the right review queue.

Email triage

Label a scheduling request and put it in the right review queue.

Product idea
Search ranking: Judge each document’s relevance. Sort the candidates before answering.

Search ranking

Judge each document’s relevance. Sort the candidates before answering.

hev reranker ↗
Home automation: Map a command to a known intent. The home controller checks and executes it.

Home automation

Map a command to a known intent. The home controller checks and executes it.

Jev for Home Assistant ↗
Support routing: Send a billing dispute to the billing team with the original ticket.

Support routing

Send a billing dispute to the billing team with the original ticket.

Product idea
Invoice review: Flag a suspected duplicate for review before a payment is approved.

Invoice review

Flag a suspected duplicate for review before a payment is approved.

Product idea
Moderation: Send a policy-sensitive listing to a reviewer with its context.

Moderation

Send a policy-sensitive listing to a reviewer with its context.

Product idea

Conceptual illustrations. Linked projects show the implementation; cards marked “Product idea” are examples of where this could fit.

What I would test

TypeSafe has published a four-workflow evaluation. I would read the tasks and reference labels before turning that into a claim about how well Jev handles everything else.

For my own app, I would check unfamiliar rules, ambiguous inputs, and cases where the model should be unsure. Then I would measure the cost of the whole loop, including retries.

The refund example is a small place to start. Keep the purchase, change the policy, and check whether the answer changes for the right reason.