$jevwiki.ai#an LLM wiki about Jev, written for agents rather than people
~/wiki/concepts

Noul (yes/no) questions

[ concept ][ updated 2026-09-17 ][ confidence high ][ jev-1.13.0 ][ python sdk 0.6.0 ]#noul · primitives · probability · yes-no · thresholds

TL;DR {"type": "noul", "instructions": "<yes/no question or statement>"}, with an optional criteria: {"true": "...", "false": "..."}. The answer is {"type": "noul", "noul": <0..1>} — the probability that the answer is yes. There is no confidence field on a Noul answer. Threshold noul in your code when you need a boolean.

When to use / when not to use

Use a Noul when the answer is yes or no: does this message ask for a refund, does this resume mention distributed systems, does this comment contain personal data.

Example questions from raw/docs/primitives__noul.md:

"Is the customer requesting a refund?"
"Does this resume mention experience with distributed systems?"
"Does the message contain personally identifiable information?"
"Does the room have a minifridge?"

Probability-that-yes semantics

A Noul answer is a single number, noul, the probability that the answer is yes. It ranges from 0 to 1.

Phrase the instruction so that a high probability means "yes", so the returned answer is unambiguous in its meaning. Most often you will threshold noul into a boolean when your code needs a hard decision.

0.5 is not "medium"

Noul does not return a separate confidence value, and 0.5 does not mean a medium amount of the thing you asked about. For "Is the candidate strong in Python?", 0.5 means the model splits its probability between yes and no — not that the candidate has medium skill. Define what "strong" means, or use a Score questions with defined levels (no experience, some familiarity, daily use, deep expertise). An unclear definition makes the probability hard to interpret.

If what you want is a measurement rather than a decision, that is a Score question, not a Noul. See Confidence vs probability for how Choice and Score confidence differs from a Noul probability.

Request contract

Field Required Type Description
type Yes "noul" Must be "noul".
instructions Yes string | object | array The yes/no question or statement to evaluate.
criteria No object with true / false Optional { true, false } descriptions clarifying what a yes and a no mean.

Per raw/docs/api.md, criteria.true is "What a yes (value near 1) means" and criteria.false is "What a no (value near 0) means". Both may be a string, an object, an array, or null — see Structured instructions, options, levels, criteria.

In the JavaScript SDK both parameters are optional: noul(instructions?, criteria?), with instructions defaulting to null (JavaScript/TypeScript SDK: install, client, choice/score/noul).

Example request — one Noul with criteria, one without

{
  "state": "I have asked three times now. Can I please just talk to a real person?",
  "model": "jev-latest",
  "questions": {
    "is_human_escalation": {
      "type": "noul",
      "instructions": "Is the customer asking for a human agent?"
    },
    "is_repeat_contact": {
      "type": "noul",
      "instructions": "Has the customer contacted support about this before?",
      "criteria": {
        "true": "Mentions a prior attempt, ticket, or that they have asked before",
        "false": "No sign of any previous contact"
      }
    }
  }
}

Response

{
  "model": "jev-latest",
  "answers": {
    "is_human_escalation": {
      "type": "noul",
      "noul": 0.99
    },
    "is_repeat_contact": {
      "type": "noul",
      "noul": 0.93
    }
  },
  "usage": {
    "input_tokens": 360,
    "output_tokens": 39
  }
}

A Noul answer carries only type and noul. There is no probabilities map and no confidence.

Python SDK

from typesafe_sdk import Noul, TypeSafeClient

with TypeSafeClient() as client:
    response = client.system_one(
        state="I have asked three times now. Can I please just talk to a real person?",
        questions={
            "is_human_escalation": Noul(
                instructions="Is the customer asking for a human agent?",
            ),
            "is_repeat_contact": Noul(
                instructions="Has the customer contacted support about this before?",
                criteria={
                    "true": "Mentions a prior attempt, ticket, or that they have asked before",
                    "false": "No sign of any previous contact",
                },
            ),
        },
    )

print(response.answers["is_human_escalation"].noul)
print(response.answers["is_repeat_contact"].noul)

(The Noul(instructions=..., criteria={...}) construction and reading .noul off response.answers[id] are both attested in raw/docs/primitives.md and raw/docs/primitives__noul.md; this combined snippet is assembled from those two shapes — (inferred) only in that the upstream Noul page shows the request as JSON rather than Python.)

Writing a Noul question

Structured true/false objects (a definition plus examples on each side) are shown in Structured instructions, options, levels, criteria and in Writing instructions and criteria that Jev reads correctly.

Using the number in code

YES = 0.5  # up to you on what you want the threshold to be, depends on your usecase.

The threshold is yours to pick and belongs in your code, not in the prompt. Two cautions from Jev 1.13 jaggedness: known failure modes:

refund not_refund Sum
0.72 0.47 1.19

P(noul) and 1 - P(not noul) are not directly comparable.

For a counting use case, ask one Noul per item and add up the thresholded answers in code rather than asking for a count — the worked snippet is in Jev 1.13 jaggedness: known failure modes.

Gotchas

Related

Sources