# Chat

```php
$response = $relai->chat()->send(array $payload): array;
```

Route `POST /api/v1/chat`; scope `chat:create` et `tools:execute` si des tools sont
exposés.

## Chat simple

```php
$response = $relai->chat()->send(['message' => 'Bonjour']);
echo $response['assistantMessage'];
```

Sans `conversationId`, le Core crée et persiste une conversation.

## Conversation existante

```php
$response = $relai->chat()->send([
    'conversationId' => $previous['conversationId'],
    'message' => 'Développe le deuxième point.',
]);
```

Le Core recharge l'historique. Le SDK ne le conserve pas et convertit un ID entier en
chaîne pour le DTO actuel.

## Tools et modèle

```php
$response = $relai->chat()->send([
    'message' => 'Analyze the selected period.',
    'tools' => ['demo.period_summary', 'demo.activity_comparison'],
    'provider' => 'ollama',
    'model' => 'llama3.1',
    'options' => ['temperature' => 0.2],
    'metadata' => [
        'periodStart' => '2026-07-01',
        'periodEnd' => '2026-07-31',
    ],
]);
```

Le SDK transmet seulement la liste `tools`. Le Core résout, autorise, orchestre et
exécute les tools. Le SDK ne connaît pas l'application propriétaire, ne valide pas les
schémas métier, ne lance pas de boucle tool calling et ne stocke pas les messages.
`metadata` doit rester non secrète.

## Réponse

```php
/**
 * @return array{
 *   conversationId: int|string,
 *   userMessageId?: int|string,
 *   assistantMessageId?: int|string,
 *   assistantMessage: string,
 *   runId?: int|string,
 *   toolCalls?: array<int, array<string, mixed>>,
 *   metadata?: array<string, mixed>
 * }
 */
```

`toolCalls` est un tableau générique retourné par RelAI Core. Les entrées peuvent
contenir par exemple `tool`, `toolName`, `name`, `input`, `output`, `data`, `status`,
`errorMessage`, `durationMs` ou des champs d'audit selon l'évolution du Core.

Erreurs locales : message non string ou slug absent. Erreurs Core : token/scope/slug,
conversation inaccessible, provider incapable d'utiliser les tools, tool hors allowlist,
tool introuvable/inactif, validation JSON Schema échouée, timeout tool ou limite de
tool calling dépassée. Aucun retry automatique n'est fait.
