<img alt="" src="https://secure.insightful-enterprise-intelligence.com/783141.png" style="display:none;">

NVIDIA B300s are coming to Hyperstack — On-Demand in August, reserved private clusters in Q4

alert

We’ve been made aware of a fraudulent website impersonating Hyperstack at hyperstack.my.
This domain is not affiliated with Hyperstack or NexGen Cloud.

If you’ve been approached or interacted with this site, please contact our team immediately at support@hyperstack.cloud.

close
|

Updated on 22 Sep 2026

Jev: Inside TypeSafe AI's First System One Decision Model

TABLE OF CONTENTS

NVIDIA H100 SXM GPUs On-Demand

Sign up/Login

Key Takeaways

  • Jev is TypeSafe AI's first System One model, released 15 September 2026, returning typed Choice, Score and Noul answers with probabilities from a single forward pass, never generating text.
  • The restricted-softmax mechanism behind it, reproduced against Qwen2.5-0.5B-Instruct on one Hyperstack NVIDIA H100, measured 463 milliseconds per decision against 848 milliseconds for standard generation, a 1.83 times gap.
  • LangChain's independent benchmark matched Jev to a human oracle on all 500 repeated judgements, with variance 92 to 913 times lower than three large language model judges, GPT-5.6 Luna, GPT-5.6 Terra and Claude Sonnet 4.6.
  • Jev averaged $0.00035 and 0.44 seconds per call against up to $0.02811 and 2.83 seconds for those three judges, a gap that becomes $103.59 against $8,434.08 at 10,000 traces a day for 30 days.
  • The schema TypeSafe promotes as hallucination-proof only guarantees an answer sits inside the declared options, not that it is correct, so a login bug can be scored as billing with full confidence.

Jev is not a language model in the usual sense. TypeSafe AI released the Jev AI model on 15 September 2026 as the first of what it calls a System One model: an engine that takes a state and one or more questions and returns typed answers with probabilities, never a sentence. The company reports 70 to 500 millisecond end-to-end latency, together with headline claims of up to 200 times faster and 400 times cheaper than comparable large language model workflows on the same class of decision.

This piece looks past the announcement. It explains the mechanism that lets Jev skip the sentence entirely, reproduces that mechanism against an open model running on a single Hyperstack NVIDIA GPU, and checks TypeSafe’s own numbers against an independent benchmark that LangChain published within days of launch.

This piece draws on four sources throughout: TypeSafe’s own announcement and documentation, the SGLang documentation behind the scoring mechanism reproduced further down, and LangChain’s own evaluation of Jev against three large language model judges, published as Jev-as-a-Judge for Agent Evals. Figures that come from TypeSafe’s own comparisons are marked as such wherever they appear, separate from the independent measurements.

The Decision Your Code Keeps Paying Full Price For

Most of what software asks a language model to do is not writing. It is a judgement with a small number of possible answers: is this support ticket urgent, which team should own it, is a shell command safe to run, does a retrieved passage answer the question that was asked. None of that needs a paragraph. It needs one of a handful of known labels.

The usual approach reaches for the same tool regardless of the question: a full generative call, a sentence or a JSON object to wait for, and code that parses that answer back into the label it wanted in the first place. Inside an agent loop, that pattern repeats on almost every iteration.

A naive agent loopPYTHON
while not task_done:
    action = llm(context)          # full generation, just to pick a tool
    result = run_tool(action)
    context += result
    task_done = llm(context)       # full generation again, just to check "done or not"

Every pass through that loop calls a generative model twice for a judgement with only a handful of possible answers: which tool to call next, and whether the task is finished. Both are single-token decisions, priced and timed as though they were prose.

Two decisions, paid for like paragraphs

A naive agent loop calls a full generative model for a tool choice and a done check, even though both answers are a single label.

Contextstate so farLLM: pick a toolfull generationRun the toolresult appendedLLM: done yet?full generationrepeats until the LLM finally writes "done"a yes/no answer costs a fullcompletionso does a tool label

The pattern repeats on almost every iteration of the loop, so the cost compounds with every step an agent takes.

The gap between the two ways of answering comes down to how many times the model has to run. Writing an answer means running the model once per output token, because each token depends on the one written immediately before it. A bounded decision needs exactly one pass, because the set of possible answers is already known before the model is ever called.

Cost of Writing T Tokens
cost(T) = T × one forward pass
Decoding is sequential. Token 2 cannot be produced until token 1 has been appended to the sequence, so a T-token answer is T dependent passes through the model, never fewer.

Two ways to answer the same question

One writes a sentence token by token. The other returns three probabilities from a single pass.

Generatewrites an answerDecidescores the answer"Based on the line items and vendor history, thisinvoice appears to be legitimate."one token at a timeT sequential passes through the modelclean0.88fraud0.07review0.05one forward pass, no text writtenvs

The invoice example is illustrative. The mechanism behind the right-hand path is reproduced below against a real model on a Hyperstack NVIDIA GPU.

Jev’s premise, as TypeSafe AI frames it, is that language generation is the wrong interface once code already knows the set of possible answers. If every outcome can be enumerated ahead of time, the system needs a model that scores those outcomes, not one that writes about them.

What Jev Is

TypeSafe’s own documentation defines System One models as a class of AI models built to make fast, structured decisions that software can use directly. A System One model evaluates a state and returns typed answers and probabilities, and it does not write replies, produce code, or explain its own reasoning.

A request to Jev carries two things: a state, which is the text or JSON describing the situation, and one or more questions about that state. Every question declares its answer shape in advance, using one of three primitives.

Choice, Score and Noul

Choice picks one option with a probability for every option. Score places the input on a scale. Noul returns the probability that a yes or no question is true.

Choicepick one option, all probabilitiesScorea place on an ordered scaleNoulthe probability it is truebilling0.91technical0.07account0.02winner: billingconfidence 0.84missedpartialresolved1.74confidence 0.81satisfied?0.94probability true

Definitions and the response shapes are from the TypeSafe documentation.

Choice selects one option from a list defined by the caller and returns a probability for every option, not only the winner. Score places the input on an ordered scale defined by the caller and returns a probability-weighted position on that scale rather than a single label. Noul, TypeSafe’s own name for the yes-or-no primitive, returns the probability that a stated question is true. Every answer comes back as a number between 0 and 1 that application code can act on directly, with no option outside the ones the caller declared.

A Score answer such as 1.74 on a zero-to-two scale is not a rounding artefact. It is the probability-weighted average across every rung on the scale, so a result close to 2.0 signals near certainty on the top label, while 1.74 signals a strong lean towards the top label with real weight left on the one below it, information a single winning label would discard.

The Score Primitive
score = Σk pk · valuek
The probability of each rung on the scale, multiplied by that rung’s value, summed across every rung. A weighted average, not a single pick.

A single request can carry several questions about the same state, and every one of them is answered from the same evaluation, not a separate call for each.

Jev requestJSON
{
  "model": "jev-latest",
  "state": "I was charged twice for the same subscription.",
  "questions": {
    "urgent": {
      "type": "noul",
      "instructions": "Does this need attention right now?"
    },
    "team": {
      "type": "choice",
      "instructions": "Which team should own this ticket?",
      "criteria": {
        "billing": "Charges, invoices, refunds",
        "technical": "Product bugs and errors",
        "account": "Login and access problems"
      }
    }
  }
}
Jev responseJSON
{
  "urgent": {"probability": 0.61},
  "team": {
    "choice": "billing",
    "probabilities": {"billing": 0.91, "technical": 0.06, "account": 0.03}
  }
}

One state, two questions, one pass

The support ticket enters Jev once. Urgency and team ownership are both answered from that same forward pass, and code branches directly off the two probabilities.

"I was charged twice forthe same subscription."stateJevone pass, both questionsurgent0.61teambilling0.91tech0.06acct0.03if urgent and team == "billing": route(ticket)the model never runs the branch

The routing code shown is illustrative. Real thresholds should come from evaluation on labelled examples, never a guess.

Application code reads that response directly. There is no prose to parse and no answer outside the declared options, because team can only ever be one of the three names supplied in the request.

How This Differs From Structured Output

It is easy to confuse Jev’s mechanism with structured output, because both restrict what an application receives. The two do different work inside the serving engine.

A structured-output call constrains a model’s generation to a schema, so a request for a ticket’s team might return {"team": "billing"}. The schema prevents an invalid object, but it does not guarantee a correct one. The model still writes that object one token at a time: the opening brace, the field name, the value and the closing brace, decoded exactly as a sentence would be. A schema narrows the shape of the output. It does not remove the decode loop underneath it.

Jev’s fixed-answer scoring exits before that loop starts. Given the same three allowed teams, it reads one score per team from a single forward pass and normalises them into a distribution, with no token of output ever generated.

Two contracts for the same restriction

Structured output stays autoregressive underneath its schema. Fixed-answer scoring reads its answer before the decode loop begins.

Structured outputprompt + schema{"team": "..."}decode loopone token at a time,shape held by the schemaschema-valid objectstill fully generatedFixed-answer scoringprompt + labelsA / B / Cone forward passread three logits,restricted softmaxno decode loopthree probabilitiesno text ever written

Both approaches limit what an application can receive. Only one of them limits how many passes the model has to make.

The same five checkpoints, opposite answers

A generative model and Jev diverge from the first row and never converge again.

Checkpoint A generative model Jev
Output Free-form text, decoded token by token A typed answer plus a full probability distribution
Sampling Temperature, top-p and top-k shape an open-ended distribution A softmax restricted to the declared answers, nothing else
Best fit Writing, planning, explaining, calling tools Routing, gating, ranking, classification
Control Thresholds live inside a prompt, hard to review or test Thresholds live in application code, reviewable and versioned
Failure mode Malformed or off-schema prose A confident, schema-valid, wrong answer

The failure mode row matters most: a schema blocks an answer outside its list, but it never guarantees that the answer inside the list is correct.

Where That Probability Comes From

Seeing why Jev can skip the decode loop starts with what a normal generation step does. A tokenizer converts a prompt into token IDs. The model processes that sequence and produces one vector for the next position, holding a raw score, a logit, for every token in the vocabulary, tens of thousands of numbers for a typical open model.

Turning a logit into a probability means running softmax across every other logit in that whole vocabulary.

Softmax Over the Whole Vocabulary
P(tokeni) = exp(logiti) ÷ Σj ∈ V exp(logitj)
V is the entire vocabulary, tens of thousands of terms in the denominator for a single next-token score.

Ordinary generation does not even run that plain version. It divides every logit by a temperature first, sharpening the distribution below 1 or flattening it above 1, before a token is sampled.

Temperature-Scaled Softmax
P(tokeni) = exp(logiti ÷ τ) ÷ Σj ∈ V exp(logitj ÷ τ)
That knob exists because open-ended generation has to decide how much randomness belongs in the answer. A bounded decision never asks that question, so it reports the ratio the raw logits already imply.

That whole cycle, a forward pass, decoding rules, one appended token, repeats until a stop token or a length limit ends it.

The autoregressive decode loop

A forward pass produces one vocabulary-sized vector, decoding rules choose one token, that token is appended, and the cycle repeats until a stop condition ends it.

repeats untila stop tokenPrompt so fargrows each passForward passone vector,every positionDecode rulestemperature,top-p, top-kAppend onetokento the sequence

Every one of these passes depends on the token the previous pass just wrote, which is why they run one at a time rather than together.

Reading Three Logits Instead of Tens of Thousands

A bounded decision only needs the very first vector, and only a handful of its entries. Labelling three answers A, B and C inside the prompt, and ending that prompt exactly where the model would normally start writing the label, puts the logits for all three at a single, known position. The model still produces its usual vocabulary-sized vector for that position. It holds the logit for A, the logits for B and C, and every other token in the vocabulary besides.

Every logit outside the three declared labels is discarded, and softmax runs only across the three that remain.

Restricted Softmax
P(labeli) = exp(logiti) ÷ Σj ∈ {A,B,C} exp(logitj)
Only the denominator changes: a sum over three declared answers in place of a sum over the whole vocabulary.

From tens of thousands of logits to three probabilities

Every logit except the three declared labels is discarded before softmax ever runs.

Vocabulary logits, one score per token0: -2.1...A: 6.8...B: 4.3...C: 3.1...151,643: 0.7A 6.8B 4.3C 3.1restrictedsoftmaxbilling0.90tech0.07acct0.02

With logits of 6.8, 4.3 and 3.1 for A, B and C, the restricted softmax gives roughly 0.90, 0.07 and 0.02. That is not a claim that billing has 90 per cent probability across the entire vocabulary. It is how the model splits its preference among exactly the three answers the application allowed, after every other token has been ruled out.

Why the Labels Are Single Letters, Not Whole Words

A visible word is not necessarily one token. billing might be one token for one tokenizer and several for another, and technical support spans more than one position under any tokenizer. Comparing multi-token phrases would need sequence scoring: score the first token, append it, score the next, and combine the values for the whole phrase, with length becoming part of the comparison. A single-letter label avoids that problem entirely, because every option sits at exactly one output position while the meaning behind it still lives in the prompt next to the letter.

A second trap sits underneath the first. Tokenizers often fold a leading space into a token, so A and  A can resolve to two different token IDs, and a chat template can insert that whitespace without it being obvious from the prompt text alone. The way around this is to render the full prompt through the model’s own chat template, check the exact continuation it expects at the answer position, and confirm through a tokenizer call that each label resolves to exactly one token before trusting a scoring request against it.

Two reasons the labels are single verified letters

A visible word can span more than one token, and a leading space can silently point at a different token from the one intended.

A word is not always one token"billing"1 token here, maybe 2 elsewhere"technical support"always more than one tokena single letter sits at exactly one positionA leading space changes the token"A"" A"leading spacetoken 32 vs token 362, two different IDs

Both failure modes are silent: nothing raises an error, the scoring call reads the wrong position without complaint.

📘

The declared answers still need an escape route. Restricted softmax always assigns every unit of probability mass to one of the declared labels, even when none of them fit. A security incident landing on a router that only knows billing, technical and account still gets confidently filed as one of those three. Adding an OTHER or ESCALATE option whenever the declared list might not be exhaustive is cheap insurance against exactly that failure.

Reproducing the Mechanism on a Hyperstack NVIDIA GPU

Jev itself is closed. Its weights, its Reinforcement Learning for Calibrated Decisions training run and its evaluation stack are not published. The restricted-softmax mechanism behind it, however, already sits inside open serving engines, which means the trick can be built and measured against a model under full control rather than taken on trust. The steps below reproduce that mechanism using SGLang, run here on a single Hyperstack NVIDIA H100 virtual machine rather than a laptop.

SGLang is the same serving engine behind the Kimi K3, the Qwen3.8 Max and the MiniMax H3 tutorials, so a virtual machine already configured for one of those deployments needs no extra setup for this exercise. A single NVIDIA H100 is more GPU than a 0.5 billion parameter model needs, which is the point: the model here is small on purpose, chosen so the mechanism, not the hardware, is what gets measured.

decide.py, SGLang and the model, on one GPU

The client tokenizes nothing itself. SGLang tokenizes the labels, runs the model once, and returns the three probabilities.

decide.pybuild the promptmap A / B / Cprint the decisionSGLang, on one Hyperstack NVIDIA GPU VM/tokenizeA, B, C → IDsmodel in GPUmemory, one pass/v1/scorelabel logits backthree probabilities, zero generated tokensanswer: the same three probabilities, back to decide.py

Every request below runs against a single Hyperstack NVIDIA GPU virtual machine. No cluster, no multi-node networking, and no tensor parallelism are needed for a model this size.

Starting the Model Server

A clean environment needs two packages: SGLang itself, and requests for the client that follows.

Environment setupSHELL
python3 -m venv .venv
source .venv/bin/activate
pip install "sglang[all]==0.5.10.post1" "requests==2.34.2"

The server is the only process doing GPU work. Everything after this is a client script talking to it over HTTP.

Launch SGLangSHELL
python -m sglang.launch_server \
    --model-path Qwen/Qwen2.5-0.5B-Instruct \
    --host 127.0.0.1 \
    --port 30000

The first launch downloads Qwen2.5-0.5B-Instruct from Hugging Face. Later launches reuse the local cache, and the model stays resident in GPU memory on port 30000 for every request that follows.

Defining the Choices and Building the Prompt

The client, decide.py, starts with the labels and the ticket being routed. The dictionary keeps both representations of every answer together, the letter that gets scored and the meaning returned to the application, so their order cannot drift apart between tokenizing, scoring and mapping the result back.

decide.pyPYTHON
# decide.py
import json
import requests

BASE_URL = "http://127.0.0.1:30000"
MODEL = "Qwen/Qwen2.5-0.5B-Instruct"

# A is the token that actually gets scored. "billing and payments" is what
# the application does with the answer once it comes back.
choices = {
    "A": "billing and payments",
    "B": "technical support",
    "C": "account access",
}
ticket = "I was charged twice for the same subscription."
decide.py, continuedPYTHON
# decide.py (continued)
choice_lines = "\n".join(
    f"{label} = {meaning}" for label, meaning in choices.items()
)
prompt = f"""Ticket:
{ticket}
Question:
Which category matches the ticket?
Allowed labels:
{choice_lines}
Return only the label.
Label:
"""
print(prompt)
Printed promptOUTPUT
Ticket:
I was charged twice for the same subscription.
Question:
Which category matches the ticket?
Allowed labels:
A = billing and payments
B = technical support
C = account access
Return only the label.
Label:

The prompt ends at Label:, the exact position whose vocabulary vector gets read. SGLang is never asked to generate the token that would normally follow it.

Resolving the Label Token IDs

Before anything can be scored, the real token ID behind each of A, B and C has to be confirmed against this specific tokenizer, not assumed from any other model.

decide.py, continuedPYTHON
# decide.py (continued)
label_token_ids = []

for label in choices:
    response = requests.post(
        f"{BASE_URL}/tokenize",
        json={"model": MODEL, "prompt": label, "add_special_tokens": False},
        timeout=30,
    )
    response.raise_for_status()
    token_ids = response.json()["tokens"]
    if len(token_ids) != 1:
        raise ValueError(f"{label!r} is not a single token: {token_ids}")
    print(f"{label!r} -> {token_ids}")
    label_token_ids.append(token_ids[0])
Resolved token IDsOUTPUT
'A' -> [32]
'B' -> [33]
'C' -> [34]

Each label returns a single integer, so every option occupies exactly one vocabulary position. Had any label produced two or more IDs, the raise ValueError above would have stopped the script there rather than let a silent mismatch reach the scoring call.

Scoring the Three Positions

With the token IDs confirmed, the decision itself is a single HTTP call to SGLang's /v1/score endpoint, documented as computing token probabilities for specified tokens given a query, intended for classification tasks, scoring responses and log-probability computation.

decide.py, continuedPYTHON
# decide.py (continued)
response = requests.post(
    f"{BASE_URL}/v1/score",
    json={
        "model": MODEL,
        "query": prompt,
        "items": [""],
        "label_token_ids": label_token_ids,
        "apply_softmax": True,
    },
    timeout=120,
)
response.raise_for_status()
score_response = response.json()
print(json.dumps(score_response, indent=2))
scores = score_response["scores"][0]
Score responseJSON
{
  "scores": [
    [
      0.6777623295783997,
      0.31087860465049744,
      0.011359035037457943
    ]
  ]
}

query carries the full prompt. The empty string inside items tells SGLang to score the position immediately after it. label_token_ids names the three positions to read, and apply_softmax normalises those three readings into a proper probability distribution. SGLang tokenized the prompt, ran the model once, and returned three numbers in the same order the token IDs were sent, with no token generated to produce them.

The Real Numbers From This Run
logits 25.2776, 24.4982, 21.1888 → P = 0.678, 0.311, 0.011
The raw logits behind this call, before apply_softmax normalised them, plugged into the restricted softmax from the mechanism above by hand, land on the same 0.678 SGLang printed.

Mapping the Scores Back to a Decision

The last step is ordinary code, turning three floats back into the labels the application understands.

decide.py, continuedPYTHON
# decide.py (continued)
probabilities = {
    choices[label]: float(score)
    for label, score in zip(choices, scores, strict=True)
}
decision = max(probabilities, key=probabilities.get)
print(json.dumps({"decision": decision, "probabilities": probabilities}, indent=2))
Final decisionJSON
{
  "decision": "billing and payments",
  "probabilities": {
    "billing and payments": 0.6777623295783997,
    "technical support": 0.31087860465049744,
    "account access": 0.011359035037457943
  }
}

Billing wins, but only at 0.678, well short of the 0.9-plus a reader might expect. A threshold of 0.70 would catch exactly this case and send it for a second look rather than route it without review, which is the kind of decision that belongs in application code rather than inside the model.

Measuring the Difference Against Standard Generation

The mechanism explains why scoring should be faster. Measuring it is more convincing than assuming it. The scoring path above was run against a standard chat-completion call on the same SGLang server, the same model, and the same 100 support-ticket cases, both starting at the same instant. Standard generation decoded up to 32 tokens per answer, an explanation alongside the label.

Measured on the same NVIDIA GPU, the same server, the same requests

Average time per decision across 100 identical cases.

Chart: Jev-style scoring averaged 463 milliseconds per decision against 848 milliseconds for standard generation on the same SGLang server, the same model and the same 100 cases.

A measured 1.83 times gap, independent of any vendor comparison, on identical hardware and identical requests.

SCORING
463 ms
average time per decision, one forward pass
GENERATION
848 ms
average time per decision, up to 32 decoded tokens
MEASURED GAP
1.83x
on the same NVIDIA GPU, same server, same requests

That gap is also a cost figure. Every millisecond a request holds a GPU is a millisecond another request cannot use it, so the same measurement that explains Jev’s latency claim also explains why a workload built on this pattern needs less GPU time per decision than one built on ordinary chat completions, whether the model behind it is Jev or an open one served from a Hyperstack GPU billed by the minute.

Why the Number Next to the Answer Matters

A typed answer solves half the problem. The label tells application code what won. The probability tells it how close the race was, and that second number is what the code should branch on.

A close callJSON
{
  "choice": "billing",
  "probabilities": {"billing": 0.52, "technical": 0.46, "account": 0.02},
  "confidence": 0.06
}

Routing that ticket without a second look would be reckless. Billing won, but barely, and a low-confidence win should never take the same branch as a decisive one. One workable definition of confidence is the margin between the top answer and its closest rival, rather than the winning probability taken alone.

Confidence as a Margin
confidence = p(1) − p(2)
Billing at 0.52 against technical at 0.46 gives a margin of 0.06, close to a coin flip. A 0.52 winner and a 0.91 winner should never take the same branch, even though both technically won.

The same headline hides two different shapes

A confident 0.91 win and a barely-ahead 0.52 win route to different branches: automate, escalate to a larger model, or send to a person.

Confident0.910.060.03Uncertain0.520.460.02Automateconfidence > 0.9Escalateclose scores, 0.3 to 0.9Human reviewconfidence < 0.3

The thresholds live in code, where they can be reviewed, tested and changed. A dashboard label might tolerate a shaky prediction. A command that deletes data should demand a far higher bar.

Routing on confidencePYTHON
if probabilities["billing"] > 0.9:
    route_automatically(ticket, team="billing")
elif confidence < 0.3:
    send_to_human_review(ticket)
else:
    escalate_to_larger_model(ticket)

TypeSafe trains Jev with what it calls Reinforcement Learning for Calibrated Decisions, RLCD for short. The target is calibration, not only accuracy: a batch of answers each carrying 90 per cent confidence should turn out correct on roughly 90 per cent of those cases. Measuring that means binning every prediction by its stated confidence and comparing each bin’s average confidence against how often that bin was right.

Expected Calibration Error
ECE = Σbins (nbin ÷ N) × |accuracy(bin) − confidence(bin)|
A model can be accurate on average while still being miscalibrated, confidently wrong in exactly the band a reader would otherwise trust most. Confidence that does not track correctness is decoration, not a signal code can threshold on, and checking it needs a labelled evaluation set.

The Hallucination Claim, Examined Closely

TypeSafe says Jev cannot hallucinate. That statement holds under a narrow definition, and it is worth separating from a broader one that it does not support.

Declaring billing, technical and account as the only valid answers means the response can never come back as legal, an option that does not exist in the schema. It also cannot return malformed prose where code expected a label. That part of the hallucination problem does not apply to it.

It can still confidently choose the wrong valid option. A login bug scored as billing instead of technical is schema-valid and still wrong, and now the wrong customer gets refunded over an issue that was never about a charge. A schema rules out an answer that does not exist. It says nothing about whether the answer that does exist is the right one.

Two different guarantees

A schema blocks an answer outside its declared list. It has no mechanism for catching a wrong answer that sits inside that list.

Outside the schema: blockedbillingtechnicalaccount"legal" -> probability 0Inside the schema: still wrongbillingtechnicalaccounta login bug, scored "billing"

A more precise sentence than "Jev cannot hallucinate" is that it cannot break its declared output schema, but it can still be wrong.

Schema Membership Against Correctness
P(answer ∈ schema) = 1,    P(answer correct) ≤ 1
Membership in the declared schema is guaranteed with certainty. Correctness never comes with the same guarantee, and the two should not be spoken about as though they were one property.

Where Jev Earns Its Place Inside an Agent

As a System One model, Jev works best alongside a generative model, not instead of one. The generative model plans, writes, explains and calls tools, the work that needs language. Jev handles the frequent small decisions that surround that work.

Three checkpoints inside an ordinary agent loop

Jev sits beside the loop at three points: choosing which model should answer, gating a risky tool call, and verifying the result before the loop continues.

PlanChoose a modelCall a toolObserve resultthe ordinary agent looproutingJev picks the modelrisk gateJev classifies the commandverifyJev checks the result

None of these checkpoints replace the generative model. Each one decides something about the work around it.

Model Routing

A simple lookup does not need the same model as a demanding architecture review. Jev can score the incoming request and select the least expensive model likely to complete it. The router decides which model should answer, not the answer itself.

Tool Risk Gating

Before an agent runs a shell command, Jev can classify it as read-only, reversible or destructive, alongside separate questions about whether it touches production or leaves an approved directory. A high-confidence read-only command can continue unattended. A destructive or uncertain one pauses for a person.

One command, one Choice call, three consequences

The risk class Jev returns decides whether the agent continues, continues with a logged call, or pauses for review.

rm -rf /data/tmpproposed shell commandJev: Choiceread-only /reversible / destructiveRead-onlykeeps runningReversibleruns, logs the callDestructivepauses for a human

LangChain's own Jev integration applies this exact pattern through middleware that checks a tool call before it executes.

Tool risk requestJSON
{
  "model": "jev-latest",
  "state": "rm -rf /data/tmp",
  "questions": {
    "risk": {
      "type": "choice",
      "instructions": "Classify this shell command.",
      "criteria": {
        "read_only": "Inspects state, changes nothing",
        "reversible": "Changes state, but the change can be undone",
        "destructive": "Deletes data or is otherwise hard to undo"
      }
    }
  }
}

Verification

An agent can report that a task is finished while its tests are still failing. Jev can inspect the state and answer bounded questions: did the tests pass, is the agent repeating the same failed action, does the output follow policy. A hard test still catches what it was built to catch. Jev adds a semantic check for what that hard rule was never designed to see.

Problems Jev Can Solve Today

Jev sits within a broader set of AI models for automation, but it fits a specific niche inside that set. The workloads where it earns its keep share three properties: every possible answer can be named ahead of time, a careful person could judge the input quickly by hand, and the decision happens often enough that latency or cost start to matter.

Five places the same typed-decision pattern keeps paying off

Support and operations, search and retrieval, quality and safety, high-volume classification, and real-time interfaces.

Category Where it helps
Support and operations Classifying intent, urgency, department and frustration in one pass. Routing refunds through several small checks rather than one large prompt. Ranking incidents by severity before a person reads them.
Search and retrieval Reranking passages by whether they answer the query, not only by semantic closeness. Checking whether a citation supports a claim. Filtering irrelevant chunks before they reach an expensive model.
Quality and safety Screening prompts for jailbreak attempts or injection. Checking generated content against a written policy. Flagging a risky code change or tool call before it runs, beside deterministic checks rather than in place of them.
High-volume classification Labelling documents or customer messages at a scale that was previously too costly to afford. Turning free text into features for a traditional machine-learning model. Scoring every row of a corpus against the same rubric.
Real-time interfaces Choosing the next browser action from a known set of page elements. Scoring tone while someone is still typing. Jev is text-only today, so any of this needs the environment turned into text first.

A plain if statement still beats any model when deterministic code already solves the problem correctly. It is faster, cheaper and easier to test than a call of any kind.

Does This Hold Up? An Independent Benchmark

TypeSafe’s own numbers for the Jev AI model deserve a careful reading. A company benchmarking its own product tends to choose the comparison that flatters it, and TypeSafe AI reports 70 to 500 millisecond latency, $0.042 per million input tokens with output free, and headline claims of up to 200 times faster and 400 times cheaper than comparable large language model workflows. Those figures are a ceiling worth treating with care, not a promise for every workload, even where the underlying mechanism behind them is real and measured earlier in this piece.

A comparison run by a party with nothing to gain from Jev looking good is worth more. LangChain ran exactly that kind of test, comparing Jev against three large language model judges, GPT-5.6 Luna, GPT-5.6 Terra and Claude Sonnet 4.6, using its own Deep Agents harness and LangSmith for the dataset. A weather agent answered five fixed requests, each response was captured once, and every judge scored the same frozen traces across 100 repetitions, so differences in the results measure the judge rather than the agent.

Across 500 repeated pass or fail judgements against a human oracle, Jev matched the human on every single one. GPT-5.6 Terra matched on 99.8 per cent, GPT-5.6 Luna on 96.4 per cent, and Claude Sonnet 4.6 on 80.0 per cent.

Agreement with a human oracle, 500 repeated decisions

Jev matched the human reviewer on every repeated judgement. The three large language model judges did not.

Chart: pass or fail agreement with a human oracle across 500 repeated decisions. Jev 100.0 per cent, GPT-5.6 Terra 99.8 per cent, GPT-5.6 Luna 96.4 per cent, Claude Sonnet 4.6 80.0 per cent.

Source: LangChain, Jev-as-a-Judge for Agent Evals.

Accuracy alone tells half the story, since a judge can be right on average while swinging between different answers on the exact same input from one run to the next. Measuring variance across 100 repetitions on a single frozen case is where that gap opens further.

Variance Across Repeated Scores
Var(x) = E[(x − μ)2]
The mean squared distance of each repeated score from the average score on the same, unchanged case.

Quality-score variance on identical, frozen cases

Jev’s mean variance was 0.0000149. The three large language model judges were 92 to 913 times higher on the same cases.

Chart: quality-score variance relative to Jev, log scale. Jev 1x, GPT-5.6 Luna 433x, GPT-5.6 Terra 913x, Claude Sonnet 4.6 92x.

Lower variance does not by itself prove a judge is right. It can be consistently wrong. Once a judge is accurate, though, low variance is what turns that accuracy into something worth automating.

Cost and latency followed the same pattern. Jev averaged $0.00035 and 0.44 seconds per call. GPT-5.6 Luna averaged $0.00039 and 2.50 seconds, GPT-5.6 Terra $0.00289 and 2.83 seconds, and Claude Sonnet 4.6 $0.02811 and 2.16 seconds. The full project cost $0.34 for Jev against $28.17 for Claude Sonnet 4.6.

Cost per evaluator call

Log scale, because the range spans roughly 80 times between the cheapest and most expensive judge.

Chart: average cost per call, log scale. Jev $0.00035, GPT-5.6 Luna $0.00039, GPT-5.6 Terra $0.00289, Claude Sonnet 4.6 $0.02811.

Source: LangChain, Jev-as-a-Judge for Agent Evals.

Latency per evaluator call

Jev finished in under half a second on average. Every large language model judge took more than two seconds.

Chart: average latency per call. Jev 0.44 seconds, GPT-5.6 Luna 2.50 seconds, GPT-5.6 Terra 2.83 seconds, Claude Sonnet 4.6 2.16 seconds.

Source: LangChain, Jev-as-a-Judge for Agent Evals.

LangChain combined accuracy and consistency into a single signal value: oracle agreement multiplied by repeatability, the chance that two independent calls on the same frozen trace reach the same verdict.

Signal Value
signal = accuracy × repeatability
A judge that is right only sometimes, or repeatable only while wrong, scores close to zero under this definition. Only a judge that is both correct and consistent scores well.

Signal value and what it costs to run at scale

Signal value is accuracy multiplied by repeatability. The 30-day figure projects the measured per-call cost across 10,000 evaluated traces a day.

Judge Signal value 30-day cost, 10,000 traces a day
Jev 100.0% $103.59
GPT-5.6 Luna 90.1% $117.24
GPT-5.6 Terra 99.4% $866.61
Claude Sonnet 4.6 80.0% $8,434.08

Source: LangChain, Jev-as-a-Judge for Agent Evals.

30-day projected cost at 10,000 traces a day

Log scale. The gap between Jev and Claude Sonnet 4.6 is roughly 81 times at this volume.

Chart: projected 30-day cost at 10,000 evaluated traces per day, log scale. Jev $103.59, GPT-5.6 Luna $117.24, GPT-5.6 Terra $866.61, Claude Sonnet 4.6 $8,434.08.

A judge this cheap changes what teams can afford to evaluate, not only how much a single call costs.

One agent, five test cases and a narrow evaluation slice is not the final word on every workload. It is, however, an independent measurement rather than a vendor’s own comparison, and it points in the same direction the mechanism itself predicts.

Where Jev Falls Apart

Jev becomes less useful the moment the answer space stops being known ahead of time.

  • It cannot write a response, summarise a document, generate code, or explain its own reasoning.
  • It is unreliable at arithmetic, counting, date comparison or exact string manipulation. Those belong in ordinary code.
  • It struggles when a decision needs several hidden reasoning steps chained together. Splitting the judgement into smaller questions, or using a reasoning model, works better.
  • It cannot extract an unknown value directly out of text. Finding candidate values first with something else, then letting Jev choose among them, is the workable pattern.
  • Irrelevant context can reduce its accuracy, so only the state a decision needs should be sent.
  • Closed weights, an early access window, text-only input and still-thin independent calibration data outside the one benchmark cited above mean it is early to place full trust in a decision with real consequences.

Where each approach fits

Jev suits known, frequent decisions. A generative model suits open-ended work. A plain if-statement still beats either for a known answer that is rarely asked.

OPEN-ENDEDKNOWN ANSWERSFREQUENTasked constantlyRAREasked occasionallyA generative modelOpen-ended, frequent callsJev's sweet spotKnown answers, high volumeA person, or an LLMOpen-ended, rarely askedA plain if-statementKnown answers, rarely asked

A bounded, high-volume decision is Jev’s sweet spot. Open-ended work still belongs to a generative model, and a rare bounded decision belongs to ordinary code.

A simpler rule sits underneath all of this. If deterministic code already solves the problem correctly, the code should stay. A plain if statement is faster, cheaper and easier to test than any model.

A Sane Way to Roll This Out

A cheap model can still turn out expensive if its mistakes generate retries, manual review or an incident, so a rollout has to measure the whole workflow, not the token price on its own.

  1. Choose one bounded, low-risk decision. A small, clearly named set of possible answers, not the riskiest step in the pipeline.
  2. Write the rubric before calling the model. Decide in words what belongs in every option. The rubric is part of the system, not an afterthought added later.
  3. Collect representative examples first. Include the ambiguous and adversarial cases on purpose.
  4. Run it in shadow mode. Let it answer every real case without changing behaviour, and log its probabilities beside the current outcome.
  5. Plot accuracy against confidence and set thresholds from that data. The cut-off should come from the shadow-mode numbers, never a guess.
  6. Automate the safest branch first. Keep a person, or a stronger model, as the fallback for anything the thresholds flag as uncertain.
  7. Version everything. Pin the model version, the questions, the criteria and the thresholds together, so a change can be replayed against the same evaluation set.

Four stages of increasing trust

One evaluation set feeds all four stages, and human or stronger-model review stays available even at the last one.

1Shadow mode2Automate the safest branch3Escalate the rest4Version everythinghuman, or a stronger model, kept in the loop at every single stagelog probabilities beside thecurrent outcomethe highest-confidence cases onlya stronger model or a human foranything uncertainmodel, questions, criteria andthresholds pinned together

Shadow mode never changes behaviour on its own. Every stage after it automates a little more of the safest branch, never all of it at once.

Threshold Selection
θ* = argmaxθ accuracy(θ) subject to coverage(θ) ≥ cmin
The threshold that maximises accuracy while still automating at least the minimum volume the business needs, not the highest bar in the abstract.

Raising the bar too far means the system never makes a mistake because it never decides anything, which is not automation. It is expensive logging. The coverage constraint above keeps that from happening.

Why Build Decision Engines on Hyperstack?

Hyperstack is a cloud platform built for AI and machine learning workloads, from large-scale training down to AI models for developers prototyping on a single GPU, the way the walkthrough above did. A typed decision engine, whether it is Jev itself or the open pattern reproduced above, still sits beside a generative model that needs its own GPU. Here is what that pairing needs from a provider, and how it maps onto the platform:

One NVIDIA GPU Is Enough to Start
The mechanism above ran on a single NVIDIA H100. Prototyping a scoring pattern needs no cluster, only one machine to prove the branch is worth automating.
Per-Minute Billing for Fast Iteration
Spot virtual machines, billed by the minute, make shadow mode and threshold tuning cheap to repeat rather than a reason to skip it.
The Same SGLang Image, Already Proven
The Kimi K3 and Qwen3.8 Max deployments already run SGLang on Hyperstack, so a scoring endpoint and a serving endpoint can share one known-good image.
A Larger NVIDIA GPU When the Generative Side Grows
The decision engine stays small. The model it routes towards often does not. NVIDIA H200 SXM is one step away on the same platform when that model needs more memory.
Firewalled Environments for a Scoring Endpoint
Firewall rules attach per machine inside an environment, so an internal decision endpoint stays reachable only from the services meant to call it.
Transparent Rates While Thresholds Are Being Tuned
The Hyperstack GPU pricing page lists every rate per GPU per hour up front, so the cost of a shadow-mode week is known before it is booked.

Build the scoring pattern on your own NVIDIA GPU

Try a Jev-Style Decision Engine on Hyperstack

One NVIDIA H100, SGLang, and an open model are enough to measure the pattern behind Jev for yourself, on the same platform already serving Kimi K3, Qwen3.8 Max and MiniMax H3.

One NVIDIA H100 GPUSGLang /v1/score463 ms measuredBilled by the minute

Launch an NVIDIA GPU virtual machine on Hyperstack today.

FAQs

What is Jev?

The Jev AI model is TypeSafe AI’s first System One model, released 15 September 2026. As a probabilistic AI model, it takes a state and one or more typed questions and returns typed answers with probabilities in a single forward pass, rather than generating text, and cannot write prose, code or explanations.

Can Jev’s scoring mechanism be reproduced without TypeSafe’s API?

Yes. SGLang’s /v1/score endpoint exposes the same restricted-softmax mechanism used by Jev against any open model, so a Choice or Noul-style answer can be computed from one forward pass on a Hyperstack NVIDIA GPU, with no access to Jev’s own weights required.

How is Jev different from structured output?

Structured output constrains a class of AI models for structured outputs to a schema, but generation still happens token by token underneath it. Jev’s fixed-answer scoring reads three or more logits from a single forward pass instead, and never enters the decode loop, so no token is ever generated.

How much GPU do you need to reproduce this pattern?

A single NVIDIA GPU is enough for a small model such as Qwen2.5-0.5B-Instruct, the model used in the walkthrough above. Production workloads with larger models still need only one forward pass per decision, so the sizing question is model size, not decision volume.

Does Jev replace LLM-as-judge evaluation?

Not entirely. Jev belongs to a small set of LLM alternatives for automation built specifically for bounded decisions, and LangChain’s benchmark found it more accurate and consistent than three LLM judges on a narrow agent-evaluation task, at a fraction of the cost. Open-ended judgements that need written reasoning still belong to a generative model, not a typed decision engine.

Subscribe to Hyperstack!

Enter your email to get updates to your inbox every week

Get Started

Ready to build the next big thing in AI?

Sign up now
Talk to an expert

Share On Social Media

Qwen3.8 Max is a 2.4 trillion parameter mixture-of-experts model from the Qwen team, and ...

MiniMax H3 is a 33 billion parameter omni-modal generative system, open sourced on 3 ...