JEV RECIPES
Moderation output is a handful of booleans and a disposition, not a paragraph. Run it through a generative model and every item costs you a second of latency, a round of tokens, and some JSON parsing you would rather not maintain.
Every number on this page comes from our own 2,390-question run; method and limits are in the benchmark report (written in Chinese).
Harassment, spam, personal data, self-harm and adult content — five booleans, one request.
Give a high-stakes category like self-harm its own low threshold — escalate at 0.3 — rather than sharing one cutoff with spam.
import { experimental_evaluate as evaluate } from 'ai';
const { answers } = await evaluate({
model: 'typesafe-ai/jev',
state, // Paste a piece of user-generated content
questions: {
toxic: { type: 'boolean', instructions: 'Does the content contain insults, personal attacks or hateful language?' },
spam: { type: 'boolean', instructions: 'Is the content promoting a product, recruiting, or driving traffic off-platform?' },
pii: { type: 'boolean', instructions: 'Does the content expose a phone number, email, home address or government ID that identifies a person?' },
selfHarm: { type: 'boolean', instructions: 'Does the content express an intention of self-harm or suicide?' },
adult: { type: 'boolean', instructions: 'Does the content contain sexual or pornographic description?' },
},
});A disposition and a severity you can wire straight into a queue.
import { experimental_evaluate as evaluate } from 'ai';
const { answers } = await evaluate({
model: 'typesafe-ai/jev',
state, // Paste a piece of user-generated content
questions: {
action: { type: 'choice', instructions: 'How should this content be handled?',
criteria: { publish: 'Publish as is, nothing wrong with it', review: 'Contested; needs a human look', block: 'Clearly against policy, block it' } },
severity: { type: 'score', instructions: 'If there is a problem, how serious is it?',
criteria: ['No problem at all', 'Mildly off', 'Clear violation', 'Severe, act immediately'] },
targeted: { type: 'boolean', instructions: 'Is the content attacking a specific identifiable person?' },
},
});Not just good or bad, but whether a comment is worth pinning or answering.
import { experimental_evaluate as evaluate } from 'ai';
const { answers } = await evaluate({
model: 'typesafe-ai/jev',
state, // Paste a comment
questions: {
sentiment: { type: 'choice', instructions: 'What is the overall sentiment of this comment?',
criteria: { positive: 'Positive', neutral: 'Neutral or factual', negative: 'Negative' } },
constructive: { type: 'boolean', instructions: 'Does the comment contain specific, actionable information or suggestions?' },
needsReply: { type: 'boolean', instructions: 'Does this comment warrant an official response?' },
},
});You define the categories instead of accepting a fixed label set. A policy that is specific to your platform — off-platform solicitation, spoilers, low-effort AI filler — becomes one more typed question rather than a classifier you have to train.
Input is billed at $0.042 per million tokens and output is free. We were billed $0.0485 for 1,154,813 input tokens, which matches the published rate. A few hundred words with five questions attached lands in the region of one hundredth of a cent.
Rarely. Across 80 injection attempts it was misled once, tied with GPT-5.6 Sol for best of the five models we tested, where GPT-4.1-mini fell for 73. But once is not never — keep a deterministic check behind any high-impact action.
TypeSafe says it is weaker outside English and our run agrees: the same XNLI items scored 79.3% in English and 68.7% in Chinese. All three GPT-5.6 variants dropped further (13–16 points) than Jev did. Label a couple of hundred of your own items before trusting a threshold.
Each of these has a line of code that calls Jev. More of them in awesome-jev-verified.
The questions above are fixed. To write your own criteria, options and score levels, open the playground.
Open the playground