# Structured output

```php
$result = $relai->structured()->run(array $payload): array;
```

Route `POST /api/v1/structured`; scope `structured:create`.

```php
$result = $relai->structured()->run([
    'messages' => [
        ['role' => 'system', 'content' => 'Réponds de façon concise.'],
        ['role' => 'user', 'content' => 'Crée une analyse.'],
    ],
    'schema' => [
        'type' => 'object',
        'properties' => [
            'summary' => ['type' => 'string'],
            'score' => ['type' => 'integer', 'minimum' => 0, 'maximum' => 100],
        ],
        'required' => ['summary', 'score'],
        'additionalProperties' => false,
    ],
]);

print_r($result['data']);
```

Le Core envoie le JSON Schema au provider, parse la réponse et la revalide avec AJV.
Le SDK vérifie seulement que `messages` et `schema` sont des tableaux PHP.

Sans `conversationId`, le Core persiste le run mais ne crée pas de conversation. Avec
une conversation d'analyse existante, il persiste les messages et la sortie.

`/api/v1/structured` ne supporte pas les tools en V1. Le SDK refuse localement un
payload `tools` non vide avec :

```text
Structured output does not support tools yet. Use chat.send() for tool calling.
```

Utilisez `chat()->send()` pour transmettre une allowlist de tools. Le schéma structured
valide la forme, pas la véracité métier; l'application doit encore appliquer ses
invariants.
