Docs

What Jev actually returns.

Short version of the official contract, plus how this site calls it. The source of truth is docs.typesafe.ai.

Jev reads text and returns a typed decision. It does not write replies, code, or explanations. Images, audio, and video are not inputs. English is the language it was trained on first.

The call

POST https://api.typesafe.ai/v1/systemone
Authorization: Bearer $TYPESAFE_API_KEY

{
  "model": "jev-latest",
  "state": { "ticket": "My payouts have failed for 3 days." },
  "questions": {
    "urgent": { "type": "noul", "instructions": "Does this convey urgency?" }
  }
}

Question ids are for your code. They are not sent to the model, so the whole question has to live in instructions. Point at a field with a backticked path, like `ticket.message`.

Three questions

TypeYou askYou getLimits
choiceWhich of these?choice, probabilities summing to 1, confidenceUp to 255 options. This playground sends up to 40.
scoreWhere on this scale?score (can fall between levels), probabilities, legend, confidence2–10 levels, numbered from 0. Score is the expected level.
noulIs this a yes?One probability, noul, from 0 to 1No separate confidence. 0.5 means unsure, not “medium”.

Questions in one request are independent and run in parallel. Adding another barely changes latency. If a later question truly depends on an earlier answer, make a second request.

Model card

How to ask

Edges of jev-1.13

TypeSafe published these on 17 September 2026. The model is literal. It answers the words you wrote.

This site’s proxy

POST /api/v1/systemone on jevai.ai forwards the body to TypeSafe. Preset routes (API hub) fill in the questions for you. Both need Authorization: Bearer with your key. Early access is still a TypeSafe waitlist — this site cannot mint a key.

Choice, written out

A choice is a closed list. The option names and the descriptions both go to the model. The id of the question does not, so “team” as a key is not a substitute for the instruction “Which team should handle this ticket?”.

{
  "type": "choice",
  "instructions": "Which team should handle `ticket`?",
  "criteria": {
    "billing": "Charges, invoices, payouts, refunds",
    "technical": "Bugs, API errors, integration setup",
    "other": "None of the other teams fit"
  }
}

The answer has choice (the mode), probabilities (they sum to 1), and confidence from 0 to 1. Confidence is a summary of how peaked the distribution is. A flat split across three teams is low confidence even if one option is slightly ahead. You can ignore the summary and threshold on the probabilities yourself.

Up to 255 options are allowed by the model. Give it the real list, plus an other when the list might miss. For a deep taxonomy, walk one level at a time and keep the top few branches when the probabilities are close. That is a second request, because the next options depend on the first answer.

Score, written out

Levels are an ordered array, from low to high, at least 2 and at most 10. The model sees the words, not the numbers. Level 0 is the first string you sent.

{
  "type": "score",
  "instructions": "How frustrated does the customer appear?",
  "criteria": [
    "Calm, stating facts",
    "Frustrated but civil",
    "Angry or threatening to leave"
  ]
}

If the probabilities are 0 / 0.7 / 0.3, the score is 1.3. That is an expectation, not a promise that the truth sits 30% of the way from “civil” to “angry.” TypeSafe says the numeric spacing of levels on jev-1.13 is weakly calibrated. Use the score to cross a threshold. Do not invert it to recover a dollar amount or a star rating you did not define.

Noul, written out

Phrase it so a high number means yes. Optional criteria.true and criteria.false pin the boundary when “yes” is easy to misread.

{
  "type": "noul",
  "instructions": "Does `ticket` ask for a refund?",
  "criteria": {
    "true": "Asks for money back or an account credit",
    "false": "A complaint or a question, with no requested remedy"
  }
}

There is no separate confidence field. Distance from 0.5 is the uncertainty. A noul of 0.5 does not mean “medium skill” or “somewhat urgent.” If you wanted a degree, you wanted a score.

Do not assume a noul and its negation add to 1. TypeSafe’s own note on jev-1.13 shows a refund question at 0.72 and the negated question at 0.47. Ask the question you will branch on, in the words you mean, once.

Confidence is not correctness

Calibration is a property of a pile of predictions: among the cases where the model says 0.8, about 80% should be right. One answer can still be wrong. A typed value can still be the wrong type of judgment. Test thresholds on labels you trust.

A usable pattern is three bands, with the cuts depending on the damage:

Pin thresholds to jev-1.13.0 if you tuned them. jev-latest will move when a new release ships, and the response tells you which id answered.

State

A string is enough for one blob of text. An object is better once you have a ticket, an order, and a policy, because you can point a question at `ticket.messages[0].text`. An array fits a chat log. Images, audio, and video are not inputs. English is the language the model was trained on first. Other languages, including CJK, are accepted and currently less accurate.

Send only the fields the questions need. Extra paragraphs act as distractors. The budget is 64k tokens for the whole request, and 32k for the state plus the longest question. Rate limits on the official card are 250,000 tokens per second and 1,200 requests per minute, and TypeSafe has said those numbers move while demand is high.

What to keep in code

Errors you will see

401 means the key was missing or rejected. 429 means you crossed a limit. Our proxy also returns 429 if one IP fires more than 30 decision calls a minute, and 400 if the body is not a Jev request: unknown model id, more than 24 questions, or a choice with fewer than two options. The model field accepts jev-latest, jev-preview, and jev-1.13.0. Anything else is refused here so this host is not an open relay.