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

# Decisions

> How to shape a decision request and read the answers.

`POST /v1/decisions` follows a `model + state + questions -> answers` shape.
Audio is sent alongside as a multipart file.

## Transport

Send `multipart/form-data` with two parts:

| Part | Content |
| - | - |
| `request` | A JSON-encoded decision request. Send it with `type=application/json`. |
| `audio` | One audio file, up to 16 MB. |

## Request

```json theme={null}
{
  "model": "tazo-large",
  "state": { "context": "The shared context for this decision." },
  "questions": {
    "action": {
      "type": "choice",
      "instructions": "Which action should be taken?",
      "criteria": {
        "NO_TOOL": "Respond directly.",
        "get_weather": "Get weather for a city."
      }
    }
  }
}
```

**model** `string` (default: tazo-large)

`tazo-large` or `tazo-small`. See [Models](/guides/models.md). Unknown models
return `404` before anything is queued.

**state** `string | object | string[]` *required*

Context shared by all questions.

**questions** `object` *required*

A map of question ID to question. At least one question. IDs are yours, must
not be blank, and come back unchanged in `answers`.

`instructions` and each criterion also accept a string, an object, or a list of
strings. Unknown fields are rejected.

## Question types

**choice**

Pick one ID from a map of criteria. Provide at least 2 options.

```json theme={null}
{
  "type": "choice",
  "instructions": "Which action should be taken?",
  "criteria": {
    "NO_TOOL": "Respond directly.",
    "get_weather": "Get weather for a city."
  }
}
```

The answer contains the selected `choice`, a probability for every option,
and `confidence`, which is the probability of the selected choice. The
probabilities sum to 1.

```json theme={null}
{
  "type": "choice",
  "choice": "get_weather",
  "probabilities": { "NO_TOOL": 0.08, "get_weather": 0.92 },
  "confidence": 0.92
}
```

**noul**

A yes/no statement. Returns the probability that it is true.

```json theme={null}
{
  "type": "noul",
  "instructions": "Did the speaker ask for a refund?"
}
```

`criteria` is optional. If you send it, it must contain exactly the keys
`true` and `false`.

```json theme={null}
{ "type": "noul", "noul": 0.87 }
```

**score**

Defined in the v1 schema: a probability-weighted score over 2 to 10 ordered
criteria. No model supports it yet, so requests that use it are rejected.
Check `capabilities` on [`GET /v1/models`](/guides/models).

> [!NOTE]
>
> A valid v1 request that goes beyond a model's capabilities is rejected. It is
> never silently reinterpreted.

## The NO\_TOOL pattern

"None of the above" is not a special answer type. If your application needs it,
add a choice such as `NO_TOOL` and decide what to do when it is selected.
`tazo-small` requires this choice. `tazo-large` does not.

## Response

```json theme={null}
{
  "id": "dec_example",
  "model": "tazo-large",
  "answers": {
    "action": {
      "type": "choice",
      "choice": "get_weather",
      "probabilities": { "NO_TOOL": 0.08, "get_weather": 0.92 },
      "confidence": 0.92
    }
  },
  "usage": { "audio_seconds": 2.4 },
  "elapsed_ms": 52.0
}
```

`model` is always the public name, even if you submitted a legacy model ID.
Every response, including errors from a durable request, carries an
`X-Tazo-Request-Id` header.

## Synchronous, but durable

The request is persisted before it is processed, and the call waits for the
result. If your client disconnects or the wait times out, processing continues.
A `504` with `decision_pending` means the work is still running. See
[Idempotency](/guides/idempotency.md) for how to retrieve it safely.


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