> ## 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.

# Structured Output

> Get JSON back instead of prose

Asking a model for JSON in a system prompt works most of the time, which is the problem.
`generateStructured` validates the result against a schema and can repair it.

```ts theme={null}
interface Person {
  name: string
  age: number
}

const result = await RunAnywhere.llm.generateStructured<Person>(
  'Extract the name and age: Dana is 34.',
  schema,
  'validationOnly',
  { temperature: 0.1 }
)
```

Electron's `generateStructured` is generic over the parsed type, so the result is typed without
a cast.

## Enforcement modes

| Mode               | Behaviour                                            |
| ------------------ | ---------------------------------------------------- |
| `'validationOnly'` | Generate freely, then validate. The default.         |
| `'repair'`         | Validate, then retry once with a repair instruction. |
| `'constrained'`    | **Throws today.**                                    |

<Warning>
  Constrained mode throws on every SDK. It needs engine-level constrained decoding, which is not
  wired in yet. Use validation-only or repair.
</Warning>

Validation-only is right when a retry is cheap. Repair costs a second generation when the first
is invalid, which is worth it when the call is user-facing.

## The schema

```ts theme={null}
const schema = {
  /* your JSON schema */
}
```

Keep schemas small. A small model handles four flat fields reliably and a deeply nested
structure badly. When you need something complex, ask for the pieces separately.

Naming fields the way a person would helps: `totalPrice` gets better results than `tp`.

## When to reach for this

| Task                           | Approach                                |
| ------------------------------ | --------------------------------------- |
| Extracting fields from text    | Structured output                       |
| Classifying into fixed labels  | Structured output, or a one-word prompt |
| Anything you will `JSON.parse` | Structured output                       |
| Prose for a human to read      | Plain generation                        |

If you are about to write a regex over a model's reply, you want this instead.

## Temperature

Lower it. Structured extraction is not a creative task, and `0.1` to `0.3` produces far more
consistent field values than the default.
