> ## Documentation Index
> Fetch the complete documentation index at: https://docs.runanywhere.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Decision model: Eve

> Score yes/no, choice and score questions with POST /v1/decisions

Eve (`eve`) is the Wally Cloud decision model. It does not chat and generates no
text: it answers yes/no, choice and score questions about an input with a
probability for each answer. Every question is scored on its own, in prefill, and
each answer's probabilities sum to 1.

From the terminal, [`wally decide`](/wally-cli/decisions) (or `wally decisions`) uses
Eve by default, so you don't need to pass a model.

## Endpoints

```text theme={"system"}
POST https://inference.runanywhere.ai/v1/decisions
POST https://inference.runanywhere.ai/v1/systemone
Authorization: Bearer sk-runa-…
```

* `POST /v1/decisions` is the Wally request shape, documented on this page.
* `POST /v1/systemone` takes the same questions in the System One shape that
  OpenRouter's Decisions API and TypeSafe use. It is served by the same handler,
  with the same billing and limits. See [System One](#system-one) below.
* Eve is not listed by `GET /v1/models`. Call it by its id.
* Chat and text completions on `eve` are refused with `400 unsupported_endpoint`.

Authentication is the same Cloud key as chat, created in
[console.runanywhere.ai](https://console.runanywhere.ai). The examples read it from
`RUNA_CLOUD_KEY`.

## Request

`POST /v1/decisions` takes a JSON body with these fields and no others. A body with
any other field is refused with `400`.

| Field | Type | Required | Allowed values and limits |
| - | - | - | - |
| `model` | string | yes | `eve` |
| `input` | string | yes | The text every question is asked about. Not blank. It is rendered into each question's prompt, so it is billed once per question. |
| `questions` | array | yes | 1 to 128 questions, each with an `id` unique in the request. See below. |
| `temperature` | number | no | Greater than 0, at most 100. Default 1. Divides the label log-probabilities before the softmax, so it changes `probabilities` only. |
| `prompt_format_version` | integer or null | no | Pins the server's prompt wording. Eve serves version `3`. Any other version is refused with `400` before anything is billed. Null or absent means the served version. |

### Questions

Every question has these fields:

| Field | Type | Required | Limits |
| - | - | - | - |
| `id` | string | yes | 1 to 128 characters, not blank. The answer comes back under it. |
| `type` | string | yes | `yes_no`, `choice` or `score` |
| `question` | string | yes | Not blank, at most 65,536 characters |

Then, by type:

| Type | Extra fields | Labels in the answer |
| - | - | - |
| `yes_no` | `yes`, `no` (optional): text for the yes and the no answer | `yes`, `no` |
| `choice` | `options` (required): 2 to 26 objects, each `{ "name", "description"? }` | the option names |
| `score` | `levels` (required): 2 to 10 strings, labelled 0 to 9 in the order given | the level indices, `"0"` to `"9"` |

An option `name` is a single line of at most 256 characters, and names must be
distinct within a question, ignoring case and surrounding space.

### Limits

* The whole body is at most 1 MiB.
* Each question's prompt (the input, that question's wording and the server's
  template) must fit in 8,185 tokens. A longer one is refused with `400`, and
  nothing is billed.
* Per key: at most 32 requests in flight and 600 requests a minute. Over either,
  the gateway answers `429` with `Retry-After`.

### One request per question type

A yes/no question:

```json theme={"system"}
{
  "model": "eve",
  "input": "After the 2.3 deploy, every order confirmation email shows the wrong currency for EU customers.",
  "questions": [{ "id": "is_bug", "type": "yes_no", "question": "Is this a bug report?" }]
}
```

A choice question:

```json theme={"system"}
{
  "model": "eve",
  "input": "After the 2.3 deploy, every order confirmation email shows the wrong currency for EU customers.",
  "questions": [
    {
      "id": "team",
      "type": "choice",
      "question": "Which team owns this?",
      "options": [{ "name": "frontend" }, { "name": "payments" }, { "name": "email" }]
    }
  ]
}
```

A score question:

```json theme={"system"}
{
  "model": "eve",
  "input": "After the 2.3 deploy, every order confirmation email shows the wrong currency for EU customers.",
  "questions": [
    {
      "id": "severity",
      "type": "score",
      "question": "How severe is it?",
      "levels": ["cosmetic", "minor", "major", "outage"]
    }
  ]
}
```

## Response

A `200` has one answer per question, keyed by the question's `id`.

| Field | Type | Meaning |
| - | - | - |
| `object` | string | Always `decisions` |
| `model` | string | The model id you sent |
| `prompt_format_version` | integer | The prompt wording the answers were computed under (`3` for Eve) |
| `answers.<id>.type` | string | `yes_no`, `choice` or `score` |
| `answers.<id>.probabilities` | object | One probability per label, summing to 1 |
| `answers.<id>.label_mass` | number | The share of the model's next-token distribution that landed on the labels. Always 1 for Eve. |
| `answers.<id>.choice` | string | Choice questions only: the most probable option name |
| `answers.<id>.score` | number | Score questions only: the probability-weighted level, from 0 to 9 |
| `usage.prompt_tokens` | integer | Tokens prefilled: the input counted once per question, plus each question's wording |
| `usage.completion_tokens` | integer | Always 0 |
| `usage.reasoning_tokens` | integer | Always 0 |
| `usage.total_tokens` | integer | Equal to `prompt_tokens` |

## Example

The three questions above, in one request:

```bash theme={"system"}
curl https://inference.runanywhere.ai/v1/decisions \
  -H "Authorization: Bearer $RUNA_CLOUD_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eve",
    "input": "After the 2.3 deploy, every order confirmation email shows the wrong currency for EU customers.",
    "questions": [
      { "id": "is_bug", "type": "yes_no", "question": "Is this a bug report?" },
      {
        "id": "team",
        "type": "choice",
        "question": "Which team owns this?",
        "options": [{ "name": "frontend" }, { "name": "payments" }, { "name": "email" }]
      },
      {
        "id": "severity",
        "type": "score",
        "question": "How severe is it?",
        "levels": ["cosmetic", "minor", "major", "outage"]
      }
    ]
  }'
```

The response, from a production call on 2026-10-04:

```json theme={"system"}
{
  "object": "decisions",
  "model": "eve",
  "prompt_format_version": 3,
  "answers": {
    "is_bug": {
      "type": "yes_no",
      "probabilities": {
        "yes": 0.9902915212263165,
        "no": 0.009708478773683474
      },
      "label_mass": 1.0
    },
    "team": {
      "type": "choice",
      "probabilities": {
        "frontend": 0.02328114907703061,
        "payments": 0.41266824142534275,
        "email": 0.5640506094976266
      },
      "label_mass": 1.0,
      "choice": "email"
    },
    "severity": {
      "type": "score",
      "probabilities": {
        "0": 0.06803281960131544,
        "1": 0.16838284565086212,
        "2": 0.7089184284464499,
        "3": 0.05466590630137255
      },
      "label_mass": 1.0,
      "score": 1.7502174214478796
    }
  },
  "usage": {
    "prompt_tokens": 317,
    "total_tokens": 317,
    "completion_tokens": 0,
    "reasoning_tokens": 0
  }
}
```

## Errors

Errors use the same envelope as chat: `{ "error": { "message", "type", "code", "param" } }`.
A refused request is not billed.

| Status | `code` | When |
| - | - | - |
| `400` | `bad_request` | The body breaks the schema (an unknown field, a missing field, too many questions or options), a question is over the 8,185-token window, or `prompt_format_version` is not `3` |
| `400` | `unsupported_endpoint` | A chat or text completion on `eve`, or a decision on a model that is not a decision model |
| `401` | `invalid_api_key` and related | The key is missing, unknown, expired or revoked |
| `403` | `model_not_entitled` | The key cannot call this model |
| `429` | (the limiter's) | The key is over 32 in flight or 600 requests a minute. Retry after `Retry-After` seconds. |
| `503` | `draining` | The model is briefly unavailable. Retry after `Retry-After` seconds. |
| `504` | `timeout` | No answer in time |

## Billing

A decision bills its input once per question at the input rate. Nothing is
generated, so there are no output tokens to bill. At pricing version
`2026-10-03.4`, Eve's rate is \$0.042 per million input tokens. The console shows
current rates for every model.

## System One

`POST /v1/systemone` answers the same questions in the System One shape. The
model, limits and billing are the same; only the request and response shapes
differ:

| `/v1/decisions` | `/v1/systemone` |
| - | - |
| `input`: a string | `state`: a string, or a JSON array or object rendered as compact JSON |
| `questions`: an array, each with `id` | `questions`: an object keyed by your own names (1 to 128) |
| `yes_no`, `choice`, `score` | `noul` (yes/no), `choice`, `score` |
| `question` | `instructions` |
| `yes`/`no`, `options`, `levels` | `criteria`: `{ "true", "false" }` for noul, `{ "<label>": guidance }` for choice, an array of level descriptions for score |
| `temperature`, `prompt_format_version` | Not accepted (refused unless null). Other unknown top-level fields are ignored. |
| Response `answers.<id>.probabilities` | Response `answers.<name>`: `noul` (the probability of yes); `choice`, `confidence` and `probabilities`; `score`, `confidence`, `probabilities` and `legend` |
| `usage.prompt_tokens` | `usage.input_tokens` and `usage.output_tokens` (always 0), plus a top-level `id` equal to the `x-request-id` header |

The full schemas for both routes are in the Wally Decisions API contract,
version 1.1.0.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.