Use case · Mixed
Content moderation with Jev
Use Score for severity tiers and Noul for specific policy checks, then act on the probability rather than a hard label.
The problem
Moderation is never binary. You need "obviously fine", "borderline, show to a reviewer" and "block immediately" — and you need to move the line between them without retraining anything.
How Jev handles it
A Score question against an ordered rubric gives you the tier plus the full distribution. Separate Noul questions cover specific policies. Because the threshold lives in your code, tuning policy is a config change, not a model change.
response = client.system_one(
model="jev-latest",
state=user_post,
questions={
"severity": Score(
instructions="How harmful is this content?",
criteria=["Benign", "Questionable", "Harmful", "Severe"],
),
"targets_person": Noul(
instructions="Does this target a specific real person?",
criteria=NoulCriteria(
true="Names or clearly identifies an individual",
false="No specific individual targeted",
),
),
"is_spam": Noul(
instructions="Is this commercial spam?",
criteria=NoulCriteria(
true="Unsolicited promotion or link farming",
false="Genuine participation",
),
),
},
)
a = response.answers
if a["severity"].score == "Severe" or a["is_spam"].noul > 0.9:
block()Notes from the field
- Tune thresholds per surface — a comment section and a landing page do not need the same line.
- Because it cannot produce text, Jev cannot be prompt-injected into writing something harmful; the worst case is a misclassification.
- Keep human review on the borderline band. The distribution tells you exactly how big that band is.