The Three Primitives: Noul, Choice & Score
Updated 2026-09-20
On this page
Every question you send to Jev is one of three primitives. Choosing the right one is the single highest-leverage decision in question design — it determines the answer shape, the limits you operate under, and which confidence signals you get back.
The comparison table
| Noul | Choice | Score | |
|---|---|---|---|
| Question shape | Yes / no | Pick exactly one of N | Rate on a scale |
type value | "noul" | "choice" | "score" |
| You provide | instructions (required), criteria (optional) | instructions + the option list, criteria (optional) | instructions + scale size, criteria (optional) |
| Returns | probability (0–1) | selected option + probabilities per option + confidence | score value + legend (scale meanings) + probabilities per level + confidence |
| Limits | — | ≤ 255 options | 2–10 levels |
| Typical use | spam?, phishing?, worth a human reply? | ticket routing, intent buckets, category tagging | quality grading, lead scoring, idea ranking |
Example questions in one request — and yes, you can mix primitives in a single call (the questions map doesn't care):
{
"model": "jev-1.13.0",
"state": { "ticket_subject": "...", "ticket_body": "..." },
"questions": {
"needs_human": {
"type": "noul",
"instructions": "Answer yes if this ticket requires a human agent rather than a help-center link."
},
"department": {
"type": "choice",
"instructions": "Pick the department that should own this ticket.",
"options": ["billing", "technical", "account", "sales"]
},
"urgency": {
"type": "score",
"instructions": "Rate how urgent this ticket is for the customer.",
"scale": 5
}
}
}
Three questions, three primitives, one HTTP request, one bill. That packing trick is its own pattern — see Speculative Fan-Out.
How to choose
Ask what the downstream code does with the answer:
- Binary action? (keep/discard, send/skip, auto-approve/review) → Noul. You get one probability to threshold. Note Noul returns no
confidencefield — if you need a second-opinion signal, derive it from how far the probability sits from 0.5, or see Confidence & Calibration. - Routing or tagging? → Choice. The per-option
probabilitiesplus the separateconfidencefield give you both the winner and a "how decisive was this" signal for fallbacks. Mind the 255-option ceiling — beyond that, bucket first (coarse Choice → finer Choice, see Cascade Routing). - Ranking or grading? → Score. You get a value on your 2–10 level scale, the
legenddescribing what each level means, and the full distribution. Pick the smallest scale that carries your distinction — a 10-level scale where levels 6–9 are indistinguishable in your instructions is noise, not resolution.
Don't force it: if you keep writing instructions like "score 1 if no, 10 if yes," what you actually want is a Noul.
The trap: the primitives can disagree with each other
Ask "is this email spam?" as a Noul and "classify: spam / not-spam" as a Choice on the same state, and you can get answers that don't line up — the Noul says 0.7 yes while the Choice lands on not-spam. This isn't a bug; the primitives frame the judgment differently, and Jev's accuracy is jagged: strong on some framings, weaker on others, not always self-consistent across them.
Practical consequences:
- Pick one primitive per decision and make it the single source of truth. Don't cross-check Noul against Choice and average the results — you're averaging two different questions.
- If answers flip when you reframe, treat that as a signal the decision is genuinely borderline for the model — route it to the fallback (human or LLM) instead of trusting either framing. That's Confidence Gating.
- Log the primitive type with every stored verdict. A probability from a Noul and a winning probability from a Choice are not the same statistic; mixing them in one dataset poisons later calibration analysis.
Where to go next
- API Reference — exact request/response shapes per primitive
- Confidence & Calibration — reading
probabilityvsconfidence - Speculative Fan-Out — many primitives, one request
Sources
- learnjev.com — Three primitives tutorial (community documentation).
- jevai.wiki — API reference (community documentation; per-primitive limits and response fields).
- jev101.com — 什么是 Jev(中文) (community documentation, Chinese).
Unofficial fan-made handbook. Not affiliated with TypeSafe AI or jev.com.
Related Guides
Jev API Reference: Endpoint, Request Body & Response Shapes
The System One endpoint reference: POST api.typesafe.ai/v1/systemone, the state/model/questions body, per-primitive request and response shapes, 429 handling, and SDK installation.
Confidence & Calibration: When to Trust the Number
Jev returns probability (Noul) and probability + confidence (Choice/Score). What each field means, what calibration is, and how to design confidence gates that fall back to humans or LLMs.
Models & Pricing: jev-1.13.0, Costs, Limits & Honest Benchmarks
The Jev model card: jev-1.13.0 / jev-latest / jev-preview, $0.042 per million input tokens with free output, 64k context, rate limits, latency — plus the accuracy caveats nobody should skip.
State Design: State Is Not a Prompt
Jev's state field is a case file for an expert, not a chat prompt. Filter in code first, name fields so questions can point at them, and keep irrelevant detail out — it measurably degrades accuracy.