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.
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
| Type | You ask | You get | Limits |
|---|---|---|---|
| choice | Which of these? | choice, probabilities summing to 1, confidence | Up to 255 options. This playground sends up to 40. |
| score | Where on this scale? | score (can fall between levels), probabilities, legend, confidence | 2–10 levels, numbered from 0. Score is the expected level. |
| noul | Is this a yes? | One probability, noul, from 0 to 1 | No 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
jev-latestandjev-previewcurrently point atjev-1.13.0.- Price on the official card: $0.042 per million input tokens. Output tokens are free.
- Context: 64k tokens for the request. 32k for the state plus the longest question.
- Published latency band: about 70–500ms, often near 100ms from the US West Coast.
- Same weights for every account. There is no per-customer fine-tune. Put your rules in the state and the criteria.
- TypeSafe says customer requests are not used for training.
How to ask
- One judgment a person could make in a second. Split “rate this pitch” into separate questions and weight them in code.
- Keep arithmetic, dates, and counts in code. Ask Jev only for the semantic part.
- Describe what an option is, what it is not, and give two examples when neighbors blur together.
- Gate risky actions on confidence or on the probability itself. A refund can demand 0.9 where a label can live at 0.6.
- A valid type is not a correct judgment. Calibrate thresholds on your own labels.
Edges of jev-1.13
TypeSafe published these on 17 September 2026. The model is literal. It answers the words you wrote.
- Counting, hex colors, and date order are weak. Extract parts with a choice, compare them in code.
- Double negatives and “a property of a property” lose accuracy.
- Unrelated text in the state acts as a distractor.
- Hostile text in the state can steer the answer. Spell the boundary in the criteria and test it.
- A noul and the same question asked as yes/no choice are not the same number. A question and its negation need not sum to 1.
- Do not interpolate a score to recover an exact dollar amount.
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:
- High — act. Showing the wrong help article is cheap. A balance lookup can live around 0.6.
- Middle — confirm, or send to review. A transfer of money wants something closer to 0.9, and still a confirm.
- Low — do not act. Ask a person, or a slower model, or for a clearer input.
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
- Counts. If a regex can find the items, count them in code. If the match itself is a judgment, ask one noul per item and add the yeses yourself.
- Dates. Ask a choice for month, day, and year, with an explicit “not stated.” Compare the assembled dates in code.
- Arithmetic, hex colors, and anything that is already a number.
- Identities you wish were true. A choice among options and one noul per option are different questions. The choice is “which of these.” Each noul can be low for all of them.
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.