Skip to main content

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.
Think of Jev as a calculator for quality, not a reviewer who writes an essay.
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.
Runnable file: agentium-examples/eval/jev-judge.ts.

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

Those helpers send a prose prompt and parse {"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
Use llmJudge when you need a written reason, an open-ended critique, or a multi-sentence comparison.

See also