Verdict View on GitHub

Open source · MIT

One rubric, every decision model.

Write the rubric once. Verdict asks Jev, Clef and any other decision model the same questions, and shows which one agrees with your labels. It runs on your machine, with your own keys.

View on GitHub Read the docs npm install -g @verdict-ai/cli
$ verdict run -r intent.yaml -d cases.jsonl --models jev,clef,clef-flash

Wants a human × cases.jsonl: 4 case(s), 3 model(s), the same questions to each
  model        answered by             agreed with labels   failed   input tokens   time
  jev          typesafe/jev-1.14.0     7/8 (88%)            0        2,041          0.5 s
  clef         cloudflare/clef         7/8 (88%)            0        1,547          0.9 s
  clef-flash   cloudflare/clef-flash   8/8 (100%)           0        1,547          0.4 s
the models gave one answer on 7 of 8 question(s) they all answered; they differ on 1:
  explicit · urgency   expected medium   jev low (0.67) | clef low (0.53) | clef-flash medium (0.11)
A real run of the example in the repository, with two columns left out to fit. Four cases say nothing about which model is better; yours will.

The models you can use

Name any of them after --models. The rubric does not change.

Name itModelServiceChecked against the live serviceImages
jevJevTypeSafeYesNo, text only
clefClefCloudflare Workers AIYesUp to 4
clef-flashClef-flashCloudflare Workers AIYesUp to 4
openrouter:<model>For example typesafe/jev-1.13OpenRouterNot yetNo
openai:<model>OpenAI's Decisions APIOpenAINot yetNo
systemone:<model>Any endpoint that takes the same requestYoursYou check itNo

Each model is called with the key in your own environment. Rules, people and prompted models can judge a criterion too.

What you can hand it

One subject can be several of these. Each model receives what it can read.

InputOn the command lineWhat the judge receives
Texttext:…, a text file, or -The text
FileA .pdf, .html, .md, .txt or .json pathIts text
JSONjson:{…}The document, checkable against a schema
Web pageA URLThe page's visible text; with --screenshot, a picture too
YouTubeA YouTube URLThe transcript
ImageA .png, .jpg or .webp pathThe picture, for models that take images

Keys, context sizes and every detail are in the docs

You write the rubric. Every model gets the same questions.

A rubric is criteria, scales and what each level means. Verdict turns it into the typed questions decision models take, so you keep one file instead of one integration per vendor.

name: Wants a human
criteria:
  - id: wants_human
    name: Asks for a person
    scale: { type: binary, labels: ["no", "yes"] }
    anchors:
      "no": A question the bot can answer.
      "yes": Asks for an agent or a human.
  - id: urgency
    name: Urgency
    scale: { type: ordinal, labels: [low, medium, high] }
    anchors:
      low: No time pressure.
      medium: Wants it soon.
      high: Blocked now.
What you write: intent.yaml, shortened from the example.
{ "state": "please connect me to an agent",
  "questions": {
    "wants_human": {
      "type": "noul",
      "instructions": "… \"yes\" for this criterion?",
      "criteria": { "true":  "Asks for an agent or a human.",
                    "false": "A question the bot can answer." } },
    "urgency": {
      "type": "score",
      "instructions": "… on the ordered levels …",
      "criteria": [ "low: No time pressure.",
                    "medium: Wants it soon.",
                    "high: Blocked now." ] } } }
What each model receives, shortened. The run records the questions it sent, and says so when they were the same for every model.

No rubric edits to switch models

Name the models on the command line. The rubric file stays as it is, and each model's run is kept so you can compare any two case by case.

Answers you can compare

Every model's answer comes back on the rubric's own scale, with its probability. Agreement with your labels is printed with its denominator.

Checked against the live services

Jev, Clef and Clef-flash. Adapters for OpenRouter and OpenAI's decisions endpoints are in the repository and marked as not yet checked.

Three steps, on your machine

Nothing passes through us. Each model is called from where you run the command, with the key in your environment.

  1. 1 · Install

    Get the command line

    Node 20 or newer. The engine, the SDK and the server are in the same repository.

    npm install -g @verdict-ai/cli
  2. 2 · Write

    A rubric and a file of cases

    The command writes a starter rubric. Cases are lines of JSON; add the label you expect, where you have one.

    verdict rubric init intent.yaml
  3. 3 · Run

    One run per model, one table

    Agreement with your labels, tokens and time per model, then every case the models answered differently.

    verdict run -r intent.yaml -d cases.jsonl --models jev,clef

Get started on GitHub

Once you have chosen a model

The same rubric keeps working as the thing your product is judged by.

Versions that never change

Freeze a rubric and it gets an id made from its content. The same id is the same document on any machine.

Diff two versions, case by case

Fixed, regressed, moved close to flipping. A GitHub Action posts it on the pull request and fails on regressions.

Judges that are not models

Rules for what a rule can decide, people for what needs a person, and a hand-off to a person when the model is unsure.

Check it against people

Run a rubric over cases people already judged and see where it disagrees, before you trust it as a judge.

From code, not only the terminal

A TypeScript SDK, a REST API you can host, and an MCP server for agents. One engine behind all of them.

A server for teams

Keep every version where any machine can reach it by name, and say which one production runs. Self-host it from the repository.

Everything is in the docs

Rather not run the server?

Verdict Cloud is the same server, hosted: sign-in for your team, roles, and a console that shows which rubric version each environment runs and who changed it. Your cases still never leave your machines.

It is in private preview, by invitation. Join the waiting list, or write to support@verdict-ai.dev.

The console of Verdict Cloud: the prod environment runs version rv_6c30b8 of the intent rubric, changed by Ada Park, and its latest run agreed with the labels on 100% of 3 cases.
The console, with an invented team's data.