# Reading the response

Source: https://docs.temprl.org/guide/responses

> How to read Simo answers - per-question fields, values and certainty, cost and balance, and how to use calibrated probabilities as thresholds.

```python
r = c.ask(state, questions)

r["team"]                 # one answer
r["team"].choice          # fields by name; r["team"].raw is the JSON object
r.values                  # {"team": "billing", "amount": 89.0, "done": True, ...}  every answer as a plain value
r.certainty               # {"team": 0.94, "amount": 0.99, "done": 0.97, ...}      how sure, per answer
r.cost_usd                # what this request cost, in US dollars
r.balance_usd             # your balance after it
r.usage                   # tokens: input_tokens, output_tokens, cost
r.timing                  # Timing(client_ms=..., server_ms=...)
r.model                   # "simo-1-pro"
r.request_id              # quote it to support
```

## Fields per answer type

Every answer has `.result` (its value in the natural type) and `.certainty` (in [0, 1]), so code can treat all types alike:

| Type | Fields | `.result` | `.certainty` |
|---|---|---|---|
| noul | `noul` | `noul >= 0.5` | `max(noul, 1 - noul)` |
| choice | `choice`, `probabilities`, `confidence`, `args` | the option | its probability |
| score | `score`, `probabilities`, `legend`, `confidence` | the expected level | `confidence` |
| fill | `value`, `parsed`, `valid`, `confidence`, `check`, `tokens` | `parsed`, else `value` | `confidence` |
| extract | `value` / `values`, `valid`, `confidence`, `check`, `tokens` | `values` or `value` | `confidence` |
| locate | `coordinates`, `center`, `image_size`, `valid`, `confidence` | `center` | `confidence` |

To group answers by type, use `r.nouls`, `r.choices`, `r.scores`, `r.fills` and `r.extracts`.

## Act on probabilities

Decisions are calibrated: when one says 0.8 it is right about 80% of the time. Act above a high threshold, escalate in the middle, refuse or ask a person below:

```python
p = r["refund"].noul
if p > 0.95:   auto_refund()
elif p > 0.6:  ask_a_person()
else:          reply_no_refund()
```

For a `Choice`, look at the probability of the chosen option, or at the whole distribution when two options are close:

```python
a = r["team"]
if a.probabilities[a.choice] < 0.8:
    route_to_triage_queue()
```

> **Note** `confidence` on reads (Fill, Extract, Locate) reflects how sure the model was while writing. It is useful, but it is not calibrated. For a calibrated check of a value, ask for [`self_check`](https://docs.temprl.org/guide/options#self-check) and threshold `answer.check`.

## The raw JSON

Over HTTP, answers sit under `answers`, keyed by question id. See [Response format](https://docs.temprl.org/api/response) for the complete shape.

```json
{
  "model": "simo-1-pro",
  "answers": {
    "refund": {"type": "noul", "noul": 0.991},
    "team": {"type": "choice", "choice": "billing",
             "probabilities": {"billing": 0.962, "shipping": 0.021, "tech": 0.017}, "confidence": 0.962}
  },
  "usage": {"input_tokens": 212, "output_tokens": 0, "cost": 0.00000636}
}
```
