# Tools

```php
$result = $relai->tools()->execute(string $toolName, array $input = []): array;
```

Route `POST /api/v1/tools/:toolName/execute`; scope `tools:execute`.

```php
$result = $relai->tools()->execute('myapp.get_document', [
    'documentId' => 'doc_123',
]);

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

Le SDK trim et encode le nom puis envoie `{ "input": ... }`. Il ne connaît pas
l'endpoint métier, ne contient aucun schéma applicatif et n'exécute aucune logique.
Dans une conversation, préférez `chat()->send(['tools' => ['myapp.search_notes']])` :
le Core choisira et orchestrera les appels.

Le Core :

1. vérifie scope, déclaration, activation et droits;
2. refuse les tools non read-only en V1;
3. valide l'input contre le JSON Schema;
4. appelle l'application propriétaire avec ses credentials privés;
5. audite le résultat et la durée.

Le Core V1 renvoie `data`; le SDK le normalise en `output` et conserve `toolCallId`,
`tool`, `status`, `errorMessage`, `durationMs`. Un échec HTTP lève généralement
`RelaiApiException` plutôt que de retourner `status=failed`.
