Hesperan

(Docs)

Judgment types

Every question has a name, a type, instructions and — depending on the type — criteria.

Choice — pick one option

criteria maps an option key to a plain-language description. The answer names the most likely key and gives a probability for every option; they sum to 1. Up to 26 options work best.

Question
"sentiment": {
  "type": "choice",
  "instructions": "What is the overall tone of the review?",
  "criteria": {
    "positive": "praises the product or service",
    "neutral": "factual, mixed or no clear opinion",
    "negative": "complains or warns others"
  }
}
Answer
{ "type": "choice", "choice": "negative",
  "probabilities": { "positive": 0.04, "neutral": 0.11, "negative": 0.85 } }

Noul — is a statement true?

Write instructions as a statement, not a question. The answer noul is the probability that it holds. Optional criteria.true and criteria.false spell out what counts as yes and no.

Question
"phishing": {
  "type": "noul",
  "instructions": "This email is a phishing attempt.",
  "criteria": {
    "true": "it tries to obtain credentials or money under false pretences",
    "false": "it is a legitimate message"
  }
}
Answer
{ "type": "noul", "noul": 0.97 }

Score — rate on your scale

criteria is a list of level descriptions, lowest first. The answer gives the full distribution over levels (keys are the level indices as strings) and score, the expected level.

Question
"urgency": {
  "type": "score",
  "instructions": "How urgently must an engineer act on this alert?",
  "criteria": ["no action needed", "handle this week", "handle today", "page someone now"]
}
Answer
{ "type": "score", "score": 2.64,
  "probabilities": { "0": 0.01, "1": 0.06, "2": 0.21, "3": 0.72 } }

State as JSON

state can be a string or any JSON object or array. Structured state often works better than prose, because dates, statuses and amounts stay unambiguous.

Request
{
  "state": { "order": { "id": 48213, "status": "delivered", "delivered_at": "2026-09-18" },
             "message": "Still waiting for my parcel!" },
  "questions": {
    "contradiction": { "type": "noul", "instructions": "The customer's claim contradicts the order data." }
  }
}

Writing good questions

DoWhy
Describe options by what they mean, not just a labelThe descriptions are what the model compares against the state.
Make choice options mutually exclusiveOverlapping options split probability and blur the answer.
Phrase noul instructions as a claim“The customer is angry.” is clearer than “Is the customer angry?”.
Ask several questions in one requestThey share the state and are answered together; each still counts as one decision.
Use thresholds that fit the cost of a mistakeAutomate above e.g. 0.9, review the rest.