Tous les exemples utilisent des requêtes HTTP classiques. Les en-têtes et corps sont encodés en JSON UTF-8.
1. Authentification
Chaque requête doit contenir l’en-tête :API_TOKEN_DE_LA_SOCIETE correspond au champ api_token de la table company.
Si l’en-tête est manquant ou invalide, le serveur renvoie 401 Unauthorized.
2. Créer / mettre à jour un client
POST /api/v1/customers
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
companyIdentifier | string | oui | Identifiant unique du client (propre à votre système). |
metadata | object (JSON) | oui | Méta-données librement définies (nom, email, etc.). Toutes les clefs et valeurs doivent être des chaînes de caractères. |
Réponses possibles
| Code | Signification |
|---|---|
| 200 | Création ou mise à jour réussie ({ success: "…" }). |
| 400 | Paramètres manquants. |
| 401 | Token d’API invalide. |
| 500 | Erreur interne. |
Exemple de requête
2bis. Récupérer un client
GET /api/v1/customers
Permet de récupérer les informations d’un client existant à partir de son identifiant.
Paramètres de requête (query string)
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
companyIdentifier | string | oui | Identifiant unique du client (même valeur que pour POST /api/v1/customers). |
Réponses possibles
| Code | Corps JSON |
|---|---|
| 200 | { "id": 1, "company_identifier": "CLIENT_123", "data": { "email": "...", "nom": "..." } } |
| 400 | { "error": "Missing companyIdentifier query parameter" } |
| 401 | { "error": "Unauthorized: Unknown token" } |
| 404 | { "error": "Customer not found" } |
| 500 | { "error": "Internal Server Error" } |
Exemple de requête
3. Envoyer une question à un agent
POST /api/v1/responses
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
companyIdentifier | string | oui | Identifiant du client (même valeur que pour /customers). |
agentUUID | string | oui | UUID de l’agent (assistant) qui doit répondre. |
question | string | oui | Question de l’utilisateur final. |
stream | boolean | non (def: true) | true → réponse en flux (SSE) ; false → réponse complète en une fois. |
files | array | non | Fichiers (images) pour la vision. Chaque élément: { "url": "...", "type": "image/png", "name": "optionnel" }. url peut être une URL publique HTTPS ou un data: URL base64. |
uuid n’est requis : le serveur génère un identifiant de message unique.
Si files est fourni, l’assistant doit utiliser un modèle vision (vision activée), sinon la requête échoue en 403.
Les fichiers peuvent être envoyés :
- en JSON via
files(URL publique oudata:URL base64) ; - en multipart/form-data via un champ
files(un ou plusieurs fichiers).
Réponses (mode stream)
- 200 OK : renvoie un flux texte
text/html; charset=utf-8dont chaque chunk est une partie de la réponse. Le flux se termine par le marqueur:EOS:. - Autres codes d’erreur : voir tableau ci-dessous.
Réponses (mode non stream)
| Code | Corps JSON |
|---|---|
| 200 | { "message": "…", "buttons": [ "Option 1", "Option 2" ] } |
| 400 | { "error": "Missing parameters" } |
| 401 | { "error": "Unauthorized: Unknown token" } |
| 404 | { "error": "Unauthorized: Assistant not found for your company" } |
| 403 | { "error": "Image inputs require a vision-enabled model for this assistant" } |
| 500 | { "error": "Answer not found" } ou erreur interne. |
Exemple : réponse complète (stream = false)
Exemple : question avec fichiers (stream = false)
Exemple : envoi multipart/form-data
Exemple : plusieurs fichiers (multipart/form-data)
Exemple : réponse en flux (stream = true)
:EOS:.
3bis. Récupérer l’historique d’une conversation
GET /api/v1/responses
Permet de récupérer l’historique complet (questions/réponses) d’une conversation entre un client et un agent, au format JSON.
Paramètres de requête (query string)
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
companyIdentifier | string | oui | Identifiant du client (même valeur que pour /customers). |
agentUUID | string | oui | UUID de l’agent (assistant) dont on veut l’historique. |
Réponse
| Code | Corps JSON |
|---|---|
| 200 | { "messages": [ { "message": "…", "buttons": ["Option 1"], "message_type": "Question", "created_at": "…" }, ... ] } |
| 400 | { "error": "Missing parameters" } |
| 401 | { "error": "Unauthorized: Unknown token" } |
| 404 | { "error": "Unauthorized: Assistant not found for your company" } ou Customer not found |
| 500 | { "error": "Internal Server Error" } |
message: texte de la question ou réponsebuttons: tableau d’options (si présent)message_type: “Question” ou “Answer”created_at: date ISO
Exemple de requête
4. Codes d’erreur communs
| Code | Motif |
|---|---|
| 400 | Paramètre manquant ou invalide |
| 401 | En-tête Authorization absent / mauvais |
| 404 | Agent introuvable pour la société |
| 500 | Erreur interne inattendue |
5. Bonnes pratiques
- Timeout côté client : pour le mode stream, coupez la connexion si aucun chunk n’est reçu depuis >20 s.
- Réessais : en cas de 500 réessayez avec back-off exponentiel.
- Sécurité : stockez l’
API_TOKENcôté serveur uniquement.
6. Détails techniques du mode stream
Le mode streaming (stream: true, valeur par défaut) utilise un ReadableStream HTTP côté serveur.
Format
- Content-Type :
text/html; charset=utf-8 - Chaque chunk contient un fragment de texte de la réponse de l’agent, encodé en UTF-8.
- Le flux se termine par le marqueur
:EOS:(End Of Stream). - Le timeout serveur est de 120 secondes (
maxDuration). Si l’agent met plus longtemps à répondre, la connexion sera coupée.
Backpressure
Le serveur utilise le mécanismepull() du ReadableStream : les chunks sont mis en file d’attente et envoyés dès que le client est prêt à les consommer. Si le client lit lentement, le serveur met les données en tampon.
Interruption
Si le client ferme la connexion (signalabort), le serveur interrompt la génération et pousse un message d’abandon dans le flux avant de le fermer.
Multipart/form-data
Le streaming fonctionne aussi avec un envoimultipart/form-data (pour joindre des fichiers). Les champs texte (companyIdentifier, agentUUID, question, stream) sont lus depuis le FormData, et les fichiers sont convertis en data: URL base64 avant d’être transmis à l’assistant.