Jev as an eval judge
In plain terms
Your agent under test is still Claude or GPT. It writes the reply. Jev only scores that reply. You ask typed questions. You get numbers your suite can pass or fail.There is no
jevJudge() helper. Wrap Jev in custom(). Do not pass jev() to llmJudge or AgentJudgeEval — those ask a chat model to write {"score", "reason"}. Jev does not write text.The smallest example
The agent under test can be any chat model. Jev is a second agent that only judges.noul is already 0–1 — use it as the scorer score. score is a 0-based rubric index (the live API may return a fraction — Math.round it if you treat it as a level).
Write noul questions the way you mean them. “Only state facts in the ticket” fails any next step (“I will refund today”) because that promise is not in the ticket. Ask “stay true to the ticket — no invented systems or denials” if a grounded offer to help should pass.
The canned example is meant to go 1 pass / 2 fail: grounded billing passes; a made-up outage and a weather reply fail.
Which Jev question for which check
Ask several in one
judge.run — TypeSafe evaluates them in parallel against the same { ticket, reply } state.
Do not use llmJudge with Jev
{"score": 0.9, "reason": "…"}. Jev has nothing to ask, or cannot map a free-form reason string.
jev_evaluate on JevToolkit is also not this. That is a runtime pack a chat agent can call. This page is offline scoring in @agentium/eval.
When Jev is the better judge
Use Jev when:- You want a number, not a paragraph
- The criterion is closed (yes/no, a rubric, a label)
- You want confidence / probabilities, not just a winner
- You want cheap, parallel questions on the same reply
llmJudge when you need a written reason, an open-ended critique, or a multi-sentence comparison.
See also
- Eval overview — suites,
custom(), reporters - Jev as the model —
run({ questions }) - Jev examples — including this recipe
- Eval examples
- TypeSafe models