# waif — what am I feeling?

Paste something you wrote and waif names the feeling behind it, and what you are doing with it. Three axes anchored to human norms, every number on the page. One call to Jev, TypeSafe's System One model, which returns calibrated probabilities instead of text.

Page: https://quirkyagents.com/wizard/projects/waif/play/ · How it is built: https://quirkyagents.com/wizard/projects/waif/ ([Markdown](https://quirkyagents.com/wizard/projects/waif/index.md))

Nothing you type is stored or logged: it goes to the model to be scored, and that is all. This is an instrument, not help; if you are having a hard time, https://findahelpline.com lists free, confidential support in most countries.

## Using the page

Write something (a message you have not sent, a note to yourself, anything; up to 1,200 characters) and press **Read it**, or tap one of the examples. You get:

- **The word**: one of 62 feeling words in 11 families (anger, fear, sadness, shame, aversion, joy, affection, calm, flat, looking ahead, startled), with what it means. When the shade did not settle and two words hold 80% or more of the weight between them, both are named, stronger first.
- **One sentence** from three axes and the intent, e.g. "Negative and keyed up, with little sense of control — and venting."
- **Notes** whenever something did not settle: the shade, the family, or an axis split between two levels.
- **Three meters**: valence (unpleasant to pleasant), arousal (shut down to at full pitch), control (powerless to in charge), five levels each.
- **What Jev actually said**: every question, every option and the probability on each.

## How it decides

One request asks: is this writing at all (Noul gate, below 0.50 nothing is scored); three Scores for the axes; a Choice for the family; a Choice over eight intents; and eleven shade Choices, one per family, each assuming its own family. The code keeps the shade answer whose family won. Published valence/arousal/dominance ratings (Warriner, Kuperman & Brysbaert, 2013) anchor the axis levels and are shown for reference; they do not pick the word.

## API

`POST https://quirkyagents.com/wizard/api/waif` with `Content-Type: application/json`

```json
{ "text": "I have asked them four times for the file and they keep saying tomorrow." }
```

`text` is 1–1200 characters. A 200 response is a reading:

```
{
  ok: true, reason: "read",
  word: "Frustration", gloss: "Blocked from something they are trying to do",
  words: [{ word, gloss, p }],            // one, or two when paired (strongest first)
  paired: false,
  family: { id, label, gloss, confidence },
  shadeConfidence, alternatives: [{ word, p }],
  norms: { v, a, d, n, sd },              // published ratings for the word, reference only
  intent: { id, label, gloss, p, confidence }, intentAlternatives: [{ word, p }],
  sentence, notes: [string], summary,     // summary: the whole reading as one speakable paragraph
  axes: { valence|arousal|control: { score, level, confidence, probabilities: [5], unsure } },
  isWriting,
  distributions: { family: {id: p}, shade: {word: p}, intent: {id: p} }
}
```

When the text does not read as something a person wrote, it comes back with `ok: false, reason: "not_writing"` and nothing scored. Errors are `{ "error": "…" }`: 400 for an empty, too long or malformed request, 429 once the daily limit is used (20 a visitor, 500 in all), 502 when the model call failed, 503 when the demo is switched off. It is a public demo on a paid key: please don't script it.
