LearnThatStack Ace your next interview
News analysis

Jev explained: the AI model that returns decisions, not text.

Jev answers your questions by picking from the options you give it, with a probability for each. It writes no text. Here is what the numbers show, what outside tests found, and how to try it safely.

22 min read 13:32 video

Plays from YouTube when you press play. Watch on YouTube

Chapters 11
On this page
  1. The if-statement you've already written
  2. What Jev is: a form, not a reply
  3. One call, three questions
  4. Why it's fast: it writes no text
  5. Calibration, the idea that makes it useful
  6. "Can't hallucinate" means the format, not the answer
  7. TypeSafe's benchmarks: mid-pack accuracy, tiny cost
  8. Outside tests: speed holds, accuracy is mixed
  9. Splitting the question helps every model
  10. Where it breaks, and the habits that help
  11. Should you try it: test on your own data
  12. Verdict: the right idea, not yet proven
  13. Sources

Jev is an AI model from TypeSafe AI, launched on 15 September 2026. You give it some data and a few questions, each with its possible answers. It picks from those answers and gives you the probabilities. It writes no text at all. This post covers how it works, what the evidence says so far, where it breaks, and how to test it on your own data.

Opening

The if-statement you've already written

If you have shipped anything with an LLM, you have probably written something like this:

def is_urgent(ticket: str) -> bool:
    reply = llm.complete(
        "Is this support ticket urgent? Answer yes or no.\n\n" + ticket
    )
    # reply: "Yes, this looks urgent because the customer..."
    return "yes" in reply.lower()

The decision is a yes or a no. To get it, you asked a model built to write text, waited for it to write some, paid for every word, and then searched the words for "yes".

Why build this

In production this grows a retry loop, a JSON parser and a validator. You will see that version below, next to the Jev one. Structured outputs fix most of the parsing. In my view they leave the harder problem alone: the model does not tell you how sure it is.

TypeSafe's launch post puts it plainly: "If a model can do a task 95% of the time but doesn't say when it's in the 5%, it can't automate that task." Asking the model for a confidence number does not fix this. When researchers asked LLMs how sure they were, the models overstated it. TypeSafe says the same: prompted for a confidence estimate, "models tend to be overconfident and inconsistent".

100 tickets, 95 answered correctly

Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100Answered tickets: 100 of 100
Nothing marks which 5 are wrong, so someone still reviews all 100. Schematic, not measured data
Show the numbers
GroupCount of 100Share
Answered tickets100100%

So someone still reviews every answer, and the task is not automated. That gap is what Jev claims to fix.

What Jev is

What Jev is: a form, not a reply

A request to Jev has two parts. The state is the data: a string, a JSON object or a list of texts. Text only, so no images, audio or video. The questions are what you want to know about it, each with its answers defined in the request.

Each question is one of three field types:

  • Choice works like a dropdown. You list the options, and Jev picks one, with a probability for every option.
  • Score works like a slider. You label the levels, and Jev places the answer on them. The score is the levels weighted by their probabilities.
  • Noul is a checkbox. It returns the probability that a statement is true.
A form with three filled-in fields: team chooses billing at 0.94, anger sits at 1.80 on a scale from calm to angry, and wants_refund is checked yes at 0.88.
What a Jev answer looks like: a filled-in form, each field with the probability behind it. Schematic, with illustrative numbers.

That is everything it can output. It does not write replies, produce code or explain its reasoning.

Isn't this a classifier? In part, yes. Classifiers have returned probabilities over labels for decades.

What TypeSafe says is new, is the mix: you write the labels in plain English with each request, and nothing is trained for your task. Its docs say Jev is "not fine-tuned or LoRA-adapted" and that "the same weights serve every account". My take: none of the parts are new, so judge it on how they fit together, and on the numbers.

The names come from psychology and economics. "System One" is Daniel Kahneman's term for fast, intuitive thinking. Jev is named after the economist W. S. Jevons.

The API

One call, three questions

Here is the video's example: a billing complaint arrives in a support queue. The state is the message plus two account fields.

from typesafe_sdk import Choice, Noul, Score, TypeSafeClient

client = TypeSafeClient()  # reads TYPESAFE_API_KEY

ticket = {
    "message": "Second time I've been billed for the annual plan this "
               "month. Fix this today or I'm cancelling.",
    "plan": "annual",
    "charges_last_30_days": 2,
}

TEAMS = {
    "billing": "Charges, refunds, invoices",
    "technical": "Bugs, outages, integration problems",
    "account": "Login, profile, plan changes",
}
MOODS = [
    "Calm and matter-of-fact",
    "Annoyed but polite",
    "Angry or threatening to leave",
]

TEAM_Q = "Which team should own this message?"
ANGER_Q = "How upset is the customer?"
REFUND_Q = "The customer is asking for money back"

Then three questions go in one call:

questions = {
1 "team": Choice(
2 instructions=TEAM_Q,
criteria=TEAMS),
3 "anger": Score(
instructions=ANGER_Q,
criteria=MOODS),
4 "wants_refund": Noul(
instructions=REFUND_Q),
}
result = client.system_one(
5 state=ticket,
questions=questions)

Three questions about one ticket, in one call. The questions are a form: each field says what shape its answer takes.

The instructions and the options are plain English, and that is all the prompting there is. The same code works from JavaScript (@typesafe-ai/sdk) or over plain HTTP, and there are integrations for LangChain and the Vercel AI Gateway.

What comes back? TypeSafe's docs show a real response for a Score question about a bug report: "The export button crashes the settings page in Safari. It works in Chrome, but a few of our customers only use Safari."

{
  "model": "jev-1.13.0",
  "answers": {
    "bug_severity": {
      "type": "score",
      "score": 1.43,
      "confidence": 0.35,
      "legend": {
        "0": "Cosmetic; no impact to functionality",
        "1": "Broken or degraded feature, but workaround exists",
        "2": "Blocking issue; no workaround exists"
      },
      "probabilities": { "0": 0.0, "1": 0.57, "2": 0.43 }
    }
  },
  "usage": { "input_tokens": 332, "output_tokens": 18 }
}
TypeSafe's docs explorer answering how severe the Safari bug is: 0% cosmetic, 57% broken with a workaround, 43% blocking, with a confidence of 0.35.
The same answer in TypeSafe's docs: 57% on a workaround, 43% on blocking, and a confidence of 0.35. Captured 22 Sep 2026. docs.typesafe.ai

That is a reasonable reading: there is a workaround, but not for everyone. Now look at the confidence. It is not the chance that the answer is right. TypeSafe computes it from how spread out the probabilities are, and here they split 57 to 43 between two levels. That low number is the useful part: it tells your code this answer is close to a coin toss.

Acting on the answers is ordinary code:

team = result.answers["team"]

if team.confidence < 0.5:
    send_to_human(ticket)
elif team.choice == "billing" and result.answers["wants_refund"].noul > 0.8:
    start_refund_review(ticket)
else:
    route(ticket, team.choice)
Jev's answers for a ticket
check 1Team confidence under 0.5?
yes
Send it to a personJev is unsure which team owns it
no
check 2Billing, and refund above 0.8?
yes
Start a refund reviewthe money path gets its own queue
no
elseRoute to the chosen teamthe everyday case

The routing code above, as the decisions it makes. Every branch is an if-statement on a number, not a parse of prose.

Here is the same decision the old way, then with Jev:

An LLM makes the call
for attempt in range(3):
1 reply = llm.complete(PROMPT + ticket)
try:
2 data = json.loads(reply)
if data["urgent"] in ("yes", "no"):
3 return data["urgent"] == "yes"
except (ValueError, KeyError):
continue
raise ValueError("no answer after 3 tries")
Jev makes the call
result = client.system_one(
state=ticket,
4 questions={"is_urgent": Noul(
instructions="The ticket needs a reply today")},
)
answer = result.answers["is_urgent"]
5urgent = answer.noul > 0.8

The same decision twice. Structured outputs would already remove most of the parsing on the left. What Jev adds is the probability on the right: the number a threshold needs.

Where the speed comes from

Why it's fast: it writes no text

An LLM answers one token at a time, and a reasoning model writes its reasoning first. You wait for every token and pay for it as output. Jev skips generation. TypeSafe says it reads the state once, scores every question against it in parallel, and outputs probabilities over the options you listed.

LLM
read
reasoning tokens
answer tokens
Jev
one pass
Jev answers
LLM answers
  • Jev one pass - reads the state once and scores every question together
  • LLM reasoning tokens - a reasoning model writes these first
  • LLM answer tokens - one token at a time, billed as output

Schematic, not to scale. An LLM writes its answer token by token. Jev reads the state once and scores each question over the options you gave it.

TypeSafe's numbers follow from that design:

Jev's price and response time

Input price
$0.042
per million input tokens; output tokens are free
Response time
70 to 500 ms
end to end, plus your own network (servers are on the US West Coast)
Source: TypeSafe launch post and model docs, 2026-09-24 Vendor-reported

For comparison, TypeSafe's launch post puts frontier models at 3 to 329 seconds end to end. With an LLM, output tokens cost about five times as much as input. Jev counts output tokens, 18 in the response above, but does not charge for them: the phishing benchmark's bill matched its input tokens alone. TypeSafe admits it "can't prove it isn't subsidized", and expects prices to "go down, not up".

Asking several questions in one call pays off twice. The questions are scored in parallel, so the call takes about as long as one question. And the state is sent once, so you pay for its input tokens once. TypeSafe's cookbook asks 13 questions about one long article, about 54,000 characters. The article is most of every request:

13 questions about one 54,000-character article

One call, all 13 questions
0.27 s
$0.000497
13 calls, one question each
2.71 s
$0.006090
Same answers both ways, apart from tiny run-to-run noise on two questions. Source: TypeSafe parallel questions cookbook (jev-1.12), 2026-09-23 Vendor-reported

That is about 10 times faster and 12 times cheaper, for the same answers. Most of the saving on the bill comes from sending the long article once, so with a short support ticket as the state it would be much smaller.

TypeSafe also shows Jev playing Doom at about 10 queries a second, for about $7 an hour. It reads the game state as text, not pixels, and TypeSafe notes that "a non-AI doom bot could play better". Treat it as a speed demo, not a skill test.

Calibration

Calibration, the idea that makes it useful

A weather forecaster is calibrated if it rains on about 70% of the days they say "70% chance of rain".

Ten days forecast at "70% chance of rain"

Rained (7)Stayed dry (3)
Rained: 7 of 10Rained: 7 of 10Rained: 7 of 10Rained: 7 of 10Rained: 7 of 10Rained: 7 of 10Rained: 7 of 10Stayed dry: 3 of 10Stayed dry: 3 of 10Stayed dry: 3 of 10
A calibrated forecaster sees rain on about 7 of these 10 days. Schematic, not measured data
Show the numbers
GroupCount of 10Share
Rained770%
Stayed dry330%

TypeSafe trains Jev for that property. Its training method aims for "epistemically honest probabilities". If the probabilities are calibrated, then when Jev picks answers with a probability of 0.8, about 80% of them should be right.

100 answers whose chosen option had probability 0.8

Right (80)Wrong (20)
Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Right: 80 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100Wrong: 20 of 100
Calibrated means about 80 of them turn out right. It does not tell you which 80. Schematic, not measured data
Show the numbers
GroupCount of 100Share
Right8080%
Wrong2020%

Calibration is a statement about many answers, never about one. What it gives you is a number you can put a threshold on. Where you set the threshold decides what you automate and what goes to a person.

The confidence field is a different number. TypeSafe computes it from the shape of the probabilities: concentrated means confident, spread out means unsure. It is not the chance of being right: the Safari bug above had a top probability of 0.57 and a confidence of 0.35. What the launch post claims for it is an order: "higher confidence means higher accuracy".

Correction, 24 September 2026: the video goes from this calibration example straight to thresholds on confidence, which can make them sound like one number. They are different numbers: calibration is about the probabilities, and confidence only ranks answers.

Noul answers have no confidence field, since the probability is the answer. For the others, TypeSafe's docs suggest three ranges:

an answer and its confidence
check 1Above your high bar?
yes
Act automaticallythe common, clear-cut cases
no
check 2Above your low bar?
yes
Act, then flag or confirma person checks after the fact
no
elseDo not act: route it onto a person, or a bigger model

TypeSafe's suggested use of confidence. Where each bar sits depends on the cost of a mistake: showing a balance can act on less certainty than approving a transfer.

The docs add: "Start with conservative thresholds, test with your own data." A confidence of 0.8 does not mean 80% right, so only your own data can show what a threshold buys you.

Update, 24 September 2026: two outside tests now touch calibration, and the larger one is unfavourable. On 2,000 synthetic phishing emails, the phishing benchmark found Jev's probabilities less calibrated than the probability Claude Haiku 4.5 wrote in its reply. The expected calibration error was 0.154 against 0.097, where lower is better. Jev was also worse at ranking phishing above safe email: an AUROC of 0.689 against 0.837, where 1 is perfect.

The smaller test is kinder. On 40 support tickets he wrote and labelled, Paweł Józefiak found accuracy rising with confidence, bucket by bucket. Jev's one routing mistake came with a confidence of 0.33, "the lowest score in the entire run". Neither test is a calibration study.

Quick check

Jev answers 100 questions, and each time its chosen option has a probability of 0.8. If those probabilities are calibrated, what do you know?

The no-hallucination claim

"Can't hallucinate" means the format, not the answer

The launch post says: "While Jev gives up string generation, it's optimized for structured outputs and can't hallucinate." Its charts of structured-output and tool-call error rates show Jev at 0%, and the notes under them explain why:

TypeSafe's launch post notes: the LLM numbers come from OpenRouter, so there is almost certainly bias; Jev's number is not empirical, since schema matching is guaranteed, so they add 0% to the plots.
TypeSafe's notes under its error-rate charts for structured outputs and tool calls. Captured 23 Sep 2026. typesafe.ai

The first note says the LLM numbers came from OpenRouter, which may send harder queries to better models. The second says Jev's 0% was never measured: it is on the chart because the format is guaranteed.

So what is guaranteed is the format. Every answer is one of the options you listed, so Jev can't return broken output. Whether the answer is right is another matter, and a confidence of 1.0 can still be wrong. The format promise still helps, because nothing later in your pipeline breaks on a bad reply. But a wrong answer that is still a valid option gets through, and only testing on your own data shows how often that happens.

LLM, structured outputJev
formatmatches your schemaone of your options
right answernot guaranteednot guaranteeda confidence of 1.0 can still be wrong
how sureask it, and it guessesself-reported confidence runs higha probability per optioncalibration unproven
Rule of thumbOnly the format is guaranteed.
The benchmarks

TypeSafe's benchmarks: mid-pack accuracy, tiny cost

TypeSafe published four workflow evals: security incidents, agent traces, invoice processing and customer service. Each workflow splits a task into narrow questions, with code handling the logic. The LLMs ran through a probability adapter, which TypeSafe says tends to be slower and more expensive.

Read one line of the methods before any chart:

The eval site's methods note: the reference labels are an average of GPT-6 Astra and Claude Fable 5.1 answers at high thinking.
The eval site's methods note: accuracy means agreement with two frontier models. Captured 22 Sep 2026. evals.typesafe.ai

Accuracy here means agreeing with GPT-6 Astra and Claude Fable 5.1, not with people. TypeSafe's own team wrote the workflows and says "some bias could exist". The homepage's "193.6x faster, 444.6x cheaper" comes from this eval, and TypeSafe expects those gains to be "on the higher end" of what you will see.

TypeSafe's eval chart of mean accuracy against cost per case, on a log scale. Jev, the pink diamond at the far left, scores 67.8% for $0.0004 per case, level with terra and sonnet 5, which cost far more; sol and opus 5 score highest, at 74.1% and 73.1%.
TypeSafe's own chart, averaged over the four workflows. Diamonds are workflow runs, dots the same LLMs asked in one prompt. Jev, in pink, matches terra and sonnet 5 on accuracy at a small fraction of their cost. sol, terra and luna are GPT-5.6 models, and DS v4 is DeepSeek V4. Captured 23 Sep 2026. evals.typesafe.ai

On average Jev scores 67.8%, about the same as GPT-5.6 Terra and Claude Sonnet 5. The two best models, GPT-5.6 Sol and Claude Opus 5, score 74.1% and 73.1%. The gap in cost and time is much larger than the gap in accuracy:

Time and cost for one full workflow run

Linear scales, so Jev's bars are slivers

Seconds per case0 s10 s20 s30 s40 sJevSeconds per case, Jev: 0.4 s0.4 sGPT-5.6 TerraSeconds per case, GPT-5.6 Terra: 10.1 s10.1 sClaude Opus 5Seconds per case, Claude Opus 5: 37.8 s37.8 sDollars per case$0.00$0.10$0.20JevDollars per case, Jev: $0.0004$0.0004GPT-5.6 TerraDollars per case, GPT-5.6 Terra: $0.0304$0.0304Claude Opus 5Dollars per case, Claude Opus 5: $0.1761$0.1761
A case is one full workflow run, which can be several API calls. Source: TypeSafe workflow evals, mean per case, 2026-09-22 Vendor-reported
Show the numbers
PanelItemValue
Seconds per caseJev0.4 s
Seconds per caseGPT-5.6 Terra10.1 s
Seconds per caseClaude Opus 537.8 s
Dollars per caseJev$0.0004
Dollars per caseGPT-5.6 Terra$0.0304
Dollars per caseClaude Opus 5$0.1761

Per case, Jev is roughly 100 times faster than Opus and 400 times cheaper. Against Terra, it is roughly 25 times faster and 75 times cheaper. The eval site rounds Jev's figures, so these ratios are approximate.

The average hides the spread. Here is each workflow:

Jev's accuracy in each workflow

Ranked against eight LLMs; the top model changes by workflow

Security incidentsJev: 3rd of 90%40%80%Claude Opus 5Security incidents, Claude Opus 5: 66.2%66.2%GPT-5.6 SolSecurity incidents, GPT-5.6 Sol: 62.5%JevSecurity incidents, Jev: 61.7%61.7%Claude Sonnet 5Security incidents, Claude Sonnet 5: 60.8%Claude Haiku 4.5Security incidents, Claude Haiku 4.5: 58.8%GPT-5.6 LunaSecurity incidents, GPT-5.6 Luna: 52.1%GPT-5.6 TerraSecurity incidents, GPT-5.6 Terra: 51.2%DeepSeek V4 ProSecurity incidents, DeepSeek V4 Pro: 41.7%DeepSeek V4 FlashSecurity incidents, DeepSeek V4 Flash: 37.9%37.9%Agent trace observabilityJev: 6th of 9, tied0%40%80%GPT-5.6 SolAgent trace observability, GPT-5.6 Sol: 76.6%76.6%GPT-5.6 LunaAgent trace observability, GPT-5.6 Luna: 76.1%Claude Opus 5Agent trace observability, Claude Opus 5: 75.2%DeepSeek V4 FlashAgent trace observability, DeepSeek V4 Flash: 73.0%GPT-5.6 TerraAgent trace observability, GPT-5.6 Terra: 73.0%DeepSeek V4 ProAgent trace observability, DeepSeek V4 Pro: 71.6%JevAgent trace observability, Jev: 71.6%71.6%Claude Sonnet 5Agent trace observability, Claude Sonnet 5: 68.0%Claude Haiku 4.5Agent trace observability, Claude Haiku 4.5: 57.2%57.2%Invoice processingJev: 8th of 90%40%80%GPT-5.6 SolInvoice processing, GPT-5.6 Sol: 79.1%79.1%Claude Opus 5Invoice processing, Claude Opus 5: 78.4%GPT-5.6 TerraInvoice processing, GPT-5.6 Terra: 74.7%Claude Sonnet 5Invoice processing, Claude Sonnet 5: 72.9%DeepSeek V4 ProInvoice processing, DeepSeek V4 Pro: 72.7%DeepSeek V4 FlashInvoice processing, DeepSeek V4 Flash: 69.8%GPT-5.6 LunaInvoice processing, GPT-5.6 Luna: 67.8%JevInvoice processing, Jev: 61.8%61.8%Claude Haiku 4.5Invoice processing, Claude Haiku 4.5: 42.9%42.9%Customer serviceJev: 4th of 90%40%80%GPT-5.6 SolCustomer service, GPT-5.6 Sol: 78.3%78.3%DeepSeek V4 FlashCustomer service, DeepSeek V4 Flash: 76.8%DeepSeek V4 ProCustomer service, DeepSeek V4 Pro: 76.1%JevCustomer service, Jev: 76.0%76.0%GPT-5.6 TerraCustomer service, GPT-5.6 Terra: 72.7%Claude Opus 5Customer service, Claude Opus 5: 72.4%GPT-5.6 LunaCustomer service, GPT-5.6 Luna: 71.4%Claude Sonnet 5Customer service, Claude Sonnet 5: 69.3%Claude Haiku 4.5Customer service, Claude Haiku 4.5: 55.4%55.4%
Source: TypeSafe workflow evals, 2026-09-22 Vendor-reported
Show the numbers
PanelItemValue
Security incidentsClaude Opus 566.2%
Security incidentsGPT-5.6 Sol62.5%
Security incidentsJev61.7%
Security incidentsClaude Sonnet 560.8%
Security incidentsClaude Haiku 4.558.8%
Security incidentsGPT-5.6 Luna52.1%
Security incidentsGPT-5.6 Terra51.2%
Security incidentsDeepSeek V4 Pro41.7%
Security incidentsDeepSeek V4 Flash37.9%
Agent trace observabilityGPT-5.6 Sol76.6%
Agent trace observabilityGPT-5.6 Luna76.1%
Agent trace observabilityClaude Opus 575.2%
Agent trace observabilityDeepSeek V4 Flash73.0%
Agent trace observabilityGPT-5.6 Terra73.0%
Agent trace observabilityDeepSeek V4 Pro71.6%
Agent trace observabilityJev71.6%
Agent trace observabilityClaude Sonnet 568.0%
Agent trace observabilityClaude Haiku 4.557.2%
Invoice processingGPT-5.6 Sol79.1%
Invoice processingClaude Opus 578.4%
Invoice processingGPT-5.6 Terra74.7%
Invoice processingClaude Sonnet 572.9%
Invoice processingDeepSeek V4 Pro72.7%
Invoice processingDeepSeek V4 Flash69.8%
Invoice processingGPT-5.6 Luna67.8%
Invoice processingJev61.8%
Invoice processingClaude Haiku 4.542.9%
Customer serviceGPT-5.6 Sol78.3%
Customer serviceDeepSeek V4 Flash76.8%
Customer serviceDeepSeek V4 Pro76.1%
Customer serviceJev76.0%
Customer serviceGPT-5.6 Terra72.7%
Customer serviceClaude Opus 572.4%
Customer serviceGPT-5.6 Luna71.4%
Customer serviceClaude Sonnet 569.3%
Customer serviceClaude Haiku 4.555.4%

Jev ranks 3rd of 9 on security incidents and 4th on customer service. On agent traces it ties for 6th. On invoice processing it ranks 8th, at 61.8% against 79.1% for the best model.

TypeSafe does not explain that gap. The workflow already computes sums, dates, account numbers and statuses in code, so the gap is not down to simple arithmetic. It is the largest workflow by far, with eight kinds of documents and seven rounds of questions. Jev's cost per case there is $0.0011, against $0.0001 to $0.0003 in the other three. My guess: large inputs, questions that need several steps of reasoning, and some questions that still ask it to compare rates and prices.

Outside tests: speed holds, accuracy is mixed

Five outside tests are public so far. Every one that measured speed or cost found Jev far ahead on it. Accuracy is mixed.

Who Task and size Accuracy Speed Cost
Mike Taylor, Every 12 passages, 4 writing checks, 3 runs Jev caught 6 of 7 planted defects; Claude Fable 5.1 caught all 7 0.35 s vs 8.83 s per passage about 580 times lower
Vercel engineer (post on X) safety classifier, 210 decisions per model Jev 207 of 210; gpt-5.6-luna 203 of 210 median 312 ms vs 1,458 ms not stated
Bryo AI (post on X) 1,565 business emails, 10 categories Jev 96.4%; two Gemini models 97.5% and 98.5% not stated $0.08 vs $0.80 and $1.79 per 1,000 emails
Phishing benchmark 2,000 emails, half phishing, synthetic bodies asked once: Jev 62.6%, Claude Haiku 4.5 81.3%. Split into five questions: 95.0% and 93.2%, a statistical tie 239 ms vs 687 ms $0.038 vs $0.462 per 1,000 emails
Paweł Józefiak 40 support tickets he wrote and labelled Haiku tied Jev on anger and beat it on routing 370 ms vs 1.2 s $0.0000172 per call

In Mike Taylor's test for Every, Jev was 25 times faster than Claude Fable 5.1 and missed one planted defect that Fable caught. One passage proposed "a shared appointment calendar that parents and staff teach together." What would teaching a calendar mean? Fable flagged it. Jev missed it in all three runs.

Every's review: Jev took a median 0.35 seconds per passage against 8.83 for Fable 5.1, and caught six of seven planted defects to Fable's seven.
Mike Taylor's numbers on Every: a median 0.35 seconds per passage for Jev against 8.83 for Fable. Captured 22 Sep 2026. every.to

The Vercel engineer's post attaches a card with his numbers. Keep in mind that Vercel is a partner: its CEO, Guillermo Rauch, wrote that Jev is "coming to @vercel AI Gateway and likely new default". And it is a post, not a benchmark with published data. Still, the numbers are specific:

A post on X by Pranit, a Vercel engineer: we benchmarked fx auto mode (safety) classifier with TypeSafe's Jev; about 5 to 18 times faster and more accurate than gpt-5.6-luna, our current top choice.
The Vercel engineer's post on X, 17 Sep 2026. Captured 22 Sep 2026. x.com

The screenshot above cuts off before his numbers card, so here they are. Jev got 4 more right out of 210, and answered far faster, most of all in the slowest cases:

A safety classifier at Vercel: Jev against gpt-5.6-luna

210 decisions each; Jev got 207 right, gpt-5.6-luna 203

Median response0 ms4,000 ms8,000 msJevMedian response, Jev: 312 ms312 msgpt-5.6-lunaMedian response, gpt-5.6-luna: 1,458 ms1,458 msSlowest 5% (95th percentile)0 ms4,000 ms8,000 msJevSlowest 5% (95th percentile), Jev: 374 ms374 msgpt-5.6-lunaSlowest 5% (95th percentile), gpt-5.6-luna: 6,583 ms6,583 ms
70 labelled cases, 3 runs per classifier. Vercel plans to offer Jev through its AI Gateway. Source: Pranit (@fazxes), numbers card on X, 2026-09-17
Show the numbers
PanelItemValue
Median responseJev312 ms
Median responsegpt-5.6-luna1,458 ms
Slowest 5% (95th percentile)Jev374 ms
Slowest 5% (95th percentile)gpt-5.6-luna6,583 ms

Correction, 24 September 2026: the video says this benchmark was not published. His post on X does carry his numbers, shown above. It is still a post, not a full write-up with its data.

He also reports that Jev gave the same answer on all 3 runs for every case, while the LLM changed one answer. The phishing benchmark saw more change. When it ran the same 2,000 emails twice, 2.2% of Jev's verdicts flipped. Haiku's flipped 0.7% of the time, on a sample of 300.

Bryo AI's test ran the other way on accuracy, and found something more useful:

A post on X by Nikhil Mudholkar of Bryo AI: Jev lost to Gemini on our email classification benchmark. I'm still interested in putting it into production. We tested 1,565 German and English business emails across 10 categories.
Bryo AI's post on X, with its numbers card below. Captured 22 Sep 2026. x.com
Bryo AI's numbers card, Jev in three numbers: 96.4% correct overall against Gemini's 97.5% and 98.5%, $0.08 per 1,000 emails against Gemini's $0.80 and $1.79, and 737 answers at 99% or higher confidence, zero of them wrong.
Bryo AI's numbers card from the same post: Jev 96.4% correct against Gemini's 97.5% and 98.5%, at $0.08 per 1,000 emails against $0.80 and $1.79. Captured 22 Sep 2026. x.com

Jev was a little less accurate than two Gemini models, at a tenth of their cost or less. And 737 of its answers came with 99% or higher confidence, none of them wrong. That is the property you would set a threshold on.

The phishing benchmark is the most detailed of the five, and it caught Jev at its worst. When the author simply asked whether each email was phishing, Jev got 62.6% of 2,000 emails right, against 81.3% for Claude Haiku 4.5. The author then asked five narrow questions about warning signs, such as whether the link points to free hosting. A simple statistical model (a logistic regression), trained on half the emails, combined the answers:

Phishing: one broad question, then five narrow ones

Narrow questions lifted both models, and a rule with no AI came close

Asked once, all 2,000 emails0%50%100%JevAsked once, all 2,000 emails, Jev: 62.6%62.6%Claude Haiku 4.5Asked once, all 2,000 emails, Claude Haiku 4.5: 81.3%81.3%Five questions, the held-out 1,0000%50%100%JevFive questions, the held-out 1,000, Jev: 95.0%95.0%Claude Haiku 4.5Five questions, the held-out 1,000, Claude Haiku 4.5: 93.2%93.2%URL rule, no AIFive questions, the held-out 1,000, URL rule, no AI: 91.8%91.8%
The five-question scores come from the half of the emails the regression never saw. Jev's lead over Haiku there is not significant (p = 0.063). Email bodies are synthetic. Source: anisselbd/jev-phishing-bench, 2026-09-17
Show the numbers
PanelItemValue
Asked once, all 2,000 emailsJev62.6%
Asked once, all 2,000 emailsClaude Haiku 4.581.3%
Five questions, the held-out 1,000Jev95.0%
Five questions, the held-out 1,000Claude Haiku 4.593.2%
Five questions, the held-out 1,000URL rule, no AI91.8%

On the emails it never saw, the combination of Jev's five answers scored 95.0%. Haiku, asked the same five questions, scored 93.2%, a gap the author finds not significant. And a two-line rule on the link, with no AI at all, scored 91.8%. The author wrote the questions after reading how the dataset was built, and says it "largely separates by construction". In other words, the way the emails were made keeps the two kinds easy to tell apart.

So this test does not show Jev beating an LLM. It shows what TypeSafe's evals show: narrow questions, with code combining the answers, lifted both models. Jev's edge is still the price: by the author's count, its five answers cost about 27 times less than Haiku's and came about 5 times faster.

Splitting the question helps every model

TypeSafe ran each LLM two ways: asked once in a single prompt, and split into a workflow of narrow questions with code doing the logic. Every model scored higher when split, usually by 5 to 15 points:

The same eval chart, read for the split: each LLM appears twice, as a dot asked in one prompt and a diamond split into a workflow, and every diamond sits above its dot; haiku 4.5 climbs from 18.1% to 53.6%.
The same chart, read for the split: each LLM appears twice, a dot when asked in one prompt and a diamond when split into a workflow, and every diamond sits above its dot. Haiku 4.5's dot is off the scale, marked 18% at the bottom edge. Captured 23 Sep 2026. evals.typesafe.ai

The gains ran from +5.1 to +14.9 points, and Claude Haiku 4.5 gained +35.5. Not every single run agreed: DeepSeek V4 Flash lost 6.7 points on security incidents, and DeepSeek V4 Pro lost 0.5 on agent traces.

One caution: this is one vendor's eval, and its reference answers came from two frontier models answering the workflow's own narrow questions. That setup favours the split runs. Still, the phishing benchmark found the same pattern independently, for Jev and for Haiku.

You can use this even if you never touch Jev. Narrow questions with the logic in code are easier for any model to get right, and easier for you to test.

Where it breaks

Where it breaks, and the habits that help

TypeSafe keeps a page of known failure modes, with a fix for each. There are nine:

Failure mode What goes wrong TypeSafe's fix
Literal reading It answers exactly what you asked State the exact condition in the instructions
Math and numbers Arithmetic and comparisons slip Keep the arithmetic in code
Dates and times Comparing dates goes wrong Extract the dates, compare them in code
Indirection Multi-hop logic and double negatives confuse it Write the instructions as directly as possible
Large state Irrelevant detail drowns the signal Send only the fields the question needs
Adversarial content Prompt injection in the state Be explicit in the criteria, and test
Contradictions Instructions and criteria disagree Treat the criteria as part of the instruction
Structural invariants It may not respect "A implies B" Don't rely on it; check in code
Generation It cannot produce new text Turn extraction into a Choice over options

Three habits help with most of these. First, be literal. Jev answers the question you wrote, not the one you meant:

# Vague: Jev decides what "urgent" means
Noul(instructions="The ticket is urgent")

# Literal: the condition is spelled out
Noul(instructions="The service is down or they are losing money now")

Second, keep math and logic in code. If you already have the numbers, compare and count them yourself:

# Don't ask Jev: "Are more than three line items over $1,000?"
# You have the amounts. Compare and count in code:
over = sum(1 for item in invoice["lines"] if item["amount"] > 1000)
flag = over > 3

Third, ask each thing once. On the same ticket, TypeSafe's docs show "Is the customer asking for a refund?" at 0.72, and the negated question at 0.47:

Two questions that should add up to 1

Is the customer asking for a refund?
0.72
Is the customer not asking for a refund?
0.47

0.72 + 0.47 = 1.19

Source: TypeSafe known failure modes, jev-1.13, 2026-09-22 Vendor-reported

TypeSafe's warning: the two "may not be directly comparable". So ask one of them and derive the other:

refund = result.answers["wants_refund"].noul
not_refund = 1 - refund  # never ask the negated question separately

Before you build on it, know the limits (re-checked on 24 September 2026):

Limit Value
Model jev-1.13.0; the aliases jev-latest and jev-preview both point to it. Pin the versioned id once your thresholds are set.
Request size 64k tokens per request; 32k for the state plus the longest question
Rate limits 250,000 tokens per second and 1,200 requests per minute, which "can change without notice"
Answers up to 255 options per Choice and 10 levels per Score
Language English works best
Access early access, with a waitlist. Launch week briefly outran capacity, and one outside tester saw "529 system_overloaded" errors.
Explanations none: it does not explain its answers
Where it fits, and how to test it

Should you try it: test on your own data

Many LLM calls in production are decisions: route this, flag that, is this spam. Those are the ones to try. If a person reads the output, or you can't list every possible answer, keep the LLM.

an LLM call you already make
check 1Does a person read the output?
yes
Keep the LLMwriting text is the job
no
check 2Can you list every answer?
no
Keep the LLMthe answer is open-ended
yes
check 3Is it math, dates or counting?
yes
Do it in codea known weak spot for Jev
no
elseA candidate for Jevnow test it on your own labelled data

Could the answer be a form field? Only calls that end in a decision from a list are worth testing.

Where it fits, the design is always the same. Code prepares the data and does any math. Jev answers narrow questions. Your thresholds decide, and only the uncertain cases reach a person or a bigger model.

To find out whether it works for you, test it on data you trust:

  1. Pick one decision your code already asks an LLM to make.
  2. Collect a few hundred real examples, and label the right answer yourself.
  3. Rewrite the call as narrow Jev questions, with any math in code.
  4. Run both on your examples and compare accuracy.
  5. Group Jev's answers by probability and check the accuracy in each group.
  6. Set your thresholds from those groups, then pin the version with model="jev-1.13.0" so they stay valid.

Step 5 is where calibration either shows up or doesn't. This script does it for Choice and Noul questions. Save a CSV with your label, Jev's answer and the probability Jev gave that answer. For a Choice, that is answer.probabilities[answer.choice]. For a Noul, the answer is yes when noul is 0.5 or more, and its probability is max(noul, 1 - noul).

import csv
from collections import defaultdict

EDGES = [0.0, 0.5, 0.7, 0.8, 0.9, 0.95, 1.0]


def bucket(p):
    for low, high in zip(EDGES, EDGES[1:]):
        if p < high or high == 1.0:
            return f"{low:.2f}-{high:.2f}"


def accuracy_by_probability(path):
    counts = defaultdict(lambda: [0, 0])  # bucket -> [right, total]
    with open(path, newline="") as f:
        for row in csv.DictReader(f):
            b = bucket(float(row["probability"]))
            counts[b][0] += row["jev_answer"] == row["label"]
            counts[b][1] += 1
    for b in sorted(counts):
        right, total = counts[b]
        print(f"{b}  {total:4d} answers  {right / total:6.1%} right")


accuracy_by_probability("results.csv")

If the probabilities are calibrated on your data, each bucket's accuracy falls inside its range: between 80% and 90% right in the 0.80-0.90 bucket. If they are not, set your thresholds from the measured accuracy, not from the probabilities. The same script works on the confidence field, but then expect only a rise from bucket to bucket, not a match. Score answers need a different check, such as comparing the score with your own ratings.

Wrap

Verdict: the right idea, not yet proven

Question What we know Evidence
Is it fast and cheap? Yes TypeSafe's numbers, and every outside test that measured them
Is it accurate? Mid-pack, and it depends on the task TypeSafe's evals (graded against two AI models), mixed outside results
Are the probabilities calibrated? Unproven No published numbers; the largest outside test found them worse than Haiku's

My take: the premise is right. Many production LLM calls are decisions, and generating text is a slow, expensive way to make them. I'm less sure "System One" lasts as a category, and I would not trust the probabilities until I had measured them. The habits in this post carry over to any model you use.

Sources

Every claim above comes from these, checked on 24 September 2026: