At a glance
- Does
- Asks Jev where the payload sits on 2 to 10 ordered levels
- Emits
- jev.score, jev.confidence, jev.probabilities, jev.legend
- Needs
- A Jev account, an OpenRouter provider, or Watchflows Sparks
Set it up
Write the question and the Levels, lowest first — between two and ten of them, each describing a distinct, observable state. Jev answers with a position on that ladder: a number from 0 to one less than the number of levels, which drops straight into a Condition or a Math step. Confident fires at or above the Minimum confidence threshold; Unsure fires below it.

{{jev.score}} is the expected value across the whole distribution, so it can land between levels — 1.3 sits between level 1 and level 2. That is normal, not an error. Use {{jev.legend.1}} to show the level's own text.
Leave State empty to send the whole payload as an object. A single {{path}} that resolves to an object or array is sent structured, never as stringified JSON. Narrow it where you can — accuracy falls as unrelated context grows.
A third outlet, Failure, is the recovery path. It carries error and errorType when the call itself throws — TypeSafe down, the rate limit exhausted, a question it refuses. Leave it unwired and a thrown call stops the run as it always has; wire it and the run carries on down that branch instead.
Three things can pay for a Jev question, and Account is where you pick: a Jev account connected in Settings → Integrations, any OpenRouter provider you have added in Settings → AI Providers, or Watchflows Sparks if you have any. OpenRouter hosts the same model at the same price, so the answer, the outlets and your thresholds are identical whichever you choose — Sparks run these nodes with nothing to paste — the free 2,000 Sparks included. The Jev nodes stay out of the palette only while you have none of the three.
Configure
| Field | Default | What it does |
|---|---|---|
| Account | — | Who pays: a connected Jev account, OpenRouter — <provider>, or Watchflows Sparks. Left unset it uses whichever one you have — the row says which. |
| Model | jev-latest | jev-latest, jev-preview, or a dated release like jev-1.13.0 to pin a flow whose thresholds must not drift. On OpenRouter and Sparks a dated release is sent without its patch number — jev-1.13.0 asks for jev-1.13, the same release — and jev-preview is not offered at all, so a node pinned to it says so instead of running. |
| State | — | What Jev evaluates. Empty sends the whole payload. |
| Question | — | What the rubric is measuring, in plain words. |
| Levels (lowest first) | — | 2 to 10 ordered levels, each a distinct observable state. |
| Minimum confidence | 0.5 | At or above this the Confident outlet fires; below it, Unsure. |
Output
Every key is available downstream as {{key}}, and jev arrives as real structure, not a JSON string.
| Key | Type | Value |
|---|---|---|
jev.score | Number | Position on the rubric, 0 to one less than the level count — can fall between levels |
jev.confidence | Number | How peaked the distribution is, 0–1 |
jev.probabilities | Object | Level number to probability — {{jev.probabilities.2}} |
jev.legend | Object | Level number to the text you configured — {{jev.legend.2}} |
jev.outlet | String | The branch taken: Confident or Unsure |
jev.model | String | The Jev release that answered, e.g. jev-1.13.0 |
jev.provider | String | Which route answered: typesafe, openrouter or sparks |
jev.usage.inputTokens | Number | Input tokens billed for this call; output is free |
error | String | Failure outlet only: the human-readable message |
errorType | String | Failure outlet only: the category — apiError for a refused call, invalidConfiguration for a node that is not set up, sparksExhausted when a Sparks-paid question runs out of credit, sparksSettling while Watchflows AI gets this Mac ready (a few minutes) |
Example: triage a bug report
Three levels — cosmetic, workaround exists, blocking. A report that reads as mostly the middle level with a hint of the top comes back around 1.3, and a Condition on {{jev.score}} decides whether it pages anyone.

Paste this into the Flow Builder to get the same flow:
Ask Jev how severe a bug report is on three levels — cosmetic, has a workaround, blocking — and notify me when the score is 2 or above.
Good to know
Adjacent levels that shade into each other split the answer. Each level should name something you could point at in the text. Two vague neighbours produce an ambiguous score and an Unsure verdict.
Keep the rubric descriptive, not numeric. Jev is not a calculator and reads dates as text, so anything arithmetic belongs upstream in a Math step.