Cette page t'a-t-elle aidé ?

Cette page t'a-t-elle aidé ?
Référence
Endpoints REST que vous pouvez appeler côté client (cookie Supabase) ou serveur-à-serveur (JWT SSO). Stream NDJSON pour le chat, multipart pour l'upload.
Dernière mise à jour : 23 mai 2026
| Endpoint | Auth | Description |
|---|---|---|
| POST /api/chat | session ∨ JWT ∨ guest | Stream NDJSON. Une ligne JSON par delta (text-delta, tool-call, finish). |
| POST /api/gilbert/upload | session | Multipart, max 10 MB. Retourne file_id à passer dans le prochain message. |
| POST /api/gilbert/embed/test-token | session | Génère un JWT TTL 1h pour preview iframe (admins seulement). |
| POST /api/gilbert/explore/dossier | guest | Crée un dossier guest TTL 24h pour mode explore. Cookie guest posé en réponse. |
/api/chat accepte les requêtes sans header Authorization ni cookie Supabase. Dans ce cas Gilbert bascule en mode guest: un cookie de session ephémère est posé côté navigateur (isolé par cookie, donc par navigateur), et la conversation n'est rattachée à aucun utilisateur identifié.
Utile pour les démos, les pages publiques, et les flux de support pre-signup où vous voulez laisser un visiteur poser une question sans créer de compte.
En production avec des utilisateurs identifiés, passez à JWT SSO : la conversation est rattachée au sub et la limite devient par session utilisateur.
POST /api/chat HTTP/1.1
Host: gilbert.solveholding.com
Content-Type: application/json
Cookie: sb-access-token=… # OU
Authorization: Bearer JWT_SSO
{
"message": "Bonjour Gilbert",
"chat_id": null,
"attachments": []
}Le body accepte message (string, requis), chat_id (uuid ou null pour démarrer une nouvelle conv), attachments (array de file_id obtenus via /api/gilbert/upload).
Le serveur renvoie un stream application/x-ndjson : chaque ligne est un objet JSON. Lisez-les au fur et à mesure pour afficher la réponse en streaming.
HTTP/1.1 200 OK
Content-Type: application/x-ndjson; charset=utf-8
Transfer-Encoding: chunked
{"type":"text-delta","text":"Bon"}
{"type":"text-delta","text":"jour"}
{"type":"tool-call","toolName":"send_email","toolCallId":"call_abc","input":{"to":"…"}}
{"type":"tool-result","toolCallId":"call_abc","output":"sent"}
{"type":"finish","finishReason":"stop","usage":{"inputTokens":42,"outputTokens":7}}text-delta: fragment de texte assistant. Concaténer dans l'ordre.tool-call: Gilbert demande l'exécution d'un tool métier. Pour les tools côté votre backend, vous recevrez un webhook en parallèle.tool-result : résultat (succès ou erreur) du tool, avec toolCallId qui matche le tool-call.finish : fin du stream. finishReason ∈ stop · length · tool-calls · error. usage contient les tokens consommés (input + output).curl -N \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GILBERT_JWT" \
-d '{"message":"Bonjour","chat_id":null}' \
https://gilbert.solveholding.com/api/chatLe flag -N désactive le buffering de cURL pour voir les deltas en temps réel. $GILBERT_JWT est un token signé avec votre secret SSO (voir JWT SSO).
| Code | Sens | Action |
|---|---|---|
| 401 | JWT ou cookie de session fourni mais invalide / expiré. L'absence totale d'auth ne déclenche pas 401 : bascule en mode guest. | Refresh token côté backend, retry |
| 403 | Permissions insuffisantes (tenant_mismatch) | Vérifier le claim iss |
| 413 | Payload trop gros (upload > 10 MB) | Compresser ou splitter |
| 429 | Rate limit dépassé | Backoff selon header Retry-After |
| 5xx | Erreur côté Gilbert | Retry avec backoff. Status : status page |
Par défaut sur tous les endpoints :
Les réponses 429 incluent les headers X-RateLimit-Remaining et Retry-After. Pour des limites custom contactez-nous.