Envoyer un message
Utilisez cette API pour envoyer des messages à un conversation_id spécifié et recevoir les réponses générées par l'agent. L'API prend en charge divers types de contenu de message, y compris le texte, les images, l'audio et les documents.
Méthode de requête
POST
Endpoint
https://api-${endpoint}.gptbots.ai/v2/conversation/message
Authentification
Consultez la section Présentation de l'API pour les instructions d'authentification.
Requête
Exemple de requête
curl -X POST 'https://api-${endpoint}.gptbots.ai/v2/conversation/message' \
-H 'Authorization: Bearer ${API Key}' \
-H 'Content-Type: application/json' \
-d '{
"conversation_id": "686e2646cb8ee942d9a62d79",
"response_mode": "blocking",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "J'ai téléchargé 2 fichiers image, veuillez effectuer l'OCR et retourner 2 enregistrements json."
},
{
"type": "image",
"image": [
{
"base64_content": "<complete_base64_string>",
"format": "jpeg",
"name": "TAXI1"
},
{
"url": "https://gptbots.ai/example.png",
"format": "png",
"name": "TAXI2"
}
]
},
{
"type": "audio",
"audio": [
{
"url": "https://gptbots.ai/example.mp3",
"format": "mp3",
"name": "exemple1 audio"
}
]
},
{
"type": "document",
"document": [
{
"base64_content": "<complete_base64_string>",
"format": "pdf",
"name": "exemple pdf"
}
]
}
]
}
],
"conversation_config": {
"long_term_memory": false,
"short_term_memory": false,
"knowledge": {
"data_ids": [
"58c70da0403cc812641b9356",
"59c70da0403cc812641df35a"
],
"group_ids": [
"67c70da0403cc812641b93je",
"69c70da0403cc812641df35f"
]
},
"custom_variables": {
"var_current_url": "https://gptbots.ai/example",
"var_session_id": "abcdef"
}
}
}'
Remarques importantes :
- Pour les types de contenu
image,audioetdocument, vous pouvez utiliser soit l'encodage base64, soit des liens URL - les deux formats sont pris en charge. - En mode système de service client interne (Custom Helpdesk), les messages de l'agent et les messages utilisateur reçus pendant le transfert humain sont soumis avec
ai_response=falseourole=human_agent; ils sont uniquement archivés et ne déclenchent PAS l'IA. Exemple :{ "conversation_id": "686e2646cb8ee942d9a62d79", "response_mode": "blocking", "ai_response": false, "human_agent_info": { "name": "Alice", "email": "alice@example.com", "image_url": "https://gptbots.ai/avatar.png" }, "messages": [ { "role": "human_agent", "content": "Bonjour, ici le service client humain. Comment puis-je vous aider ?" } ] }{ "conversation_id": "686e2646cb8ee942d9a62d79", "response_mode": "blocking", "ai_response": false, "human_agent_info": { "name": "Alice", "email": "alice@example.com", "image_url": "https://gptbots.ai/avatar.png" }, "messages": [ { "role": "human_agent", "content": "Bonjour, ici le service client humain. Comment puis-je vous aider ?" } ] }Ce bloc de code dans la fenêtre flottante - Les développeurs n'ont besoin d'envoyer que le dernier message utilisateur, car GPTBots gère par défaut la mémoire à court et long terme. Si vous souhaitez personnaliser le contexte de la mémoire à court terme, consultez l'exemple ci-dessous :"messages": [ { "role": "user", "content": "Bonjour" //Mémoire à court terme personnalisée }, { "role": "assistant", "content": "Bonjour ! Comment puis-je vous aider aujourd'hui ?" //Mémoire à court terme personnalisée }, { "role": "user", "content": "Bonjour" //Dernier message utilisateur }]
"messages": [ { "role": "user", "content": "Bonjour" //Mémoire à court terme personnalisée }, { "role": "assistant", "content": "Bonjour ! Comment puis-je vous aider aujourd'hui ?" //Mémoire à court terme personnalisée }, { "role": "user", "content": "Bonjour" //Dernier message utilisateur }]Ce bloc de code dans la fenêtre flottante - Lorsque les développeurs utilisent LoopAgent en mode streaming, s'ils ont besoin des messages de processus générés pendant l'exécution de l'agent, ils peuvent le déclarer via le champ de requête
is_process_result.{ "conversation_id": "686e2646cb8ee942d9a62d79", "response_mode": "streaming", "is_process_result": true, "messages": [ { "role": "human_agent", "content": "Bonjour, ici le service client humain. Comment puis-je vous aider ?" } ] }{ "conversation_id": "686e2646cb8ee942d9a62d79", "response_mode": "streaming", "is_process_result": true, "messages": [ { "role": "human_agent", "content": "Bonjour, ici le service client humain. Comment puis-je vous aider ?" } ] }Ce bloc de code dans la fenêtre flottante
En-têtes de requête
| Champ | Type | Description |
|---|---|---|
| Authorization | Bearer ${API Key} | Utilisez Authorization: Bearer ${API Key} pour l'authentification. Obtenez la clé API depuis la page Clé API. |
| Content-Type | application/json | Type de données, doit être application/json. |
Paramètres de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| conversation_id | string | Oui | Identifiant unique de la conversation. Vous devez fournir le conversation_id pour poursuivre la conversation. |
| response_mode | string | Oui | Mode de réponse de l'agent : |
| messages | JSON Array | Oui | Contenu du message, prend en charge les rôles user, assistant et human_agent pour construire le contexte de la conversation.ai_response. |
| is_process_result | boolean | Non | Indique si LoopAgent renvoie les informations de processus. Peut être vide, la valeur par défaut est false.false : seule la réponse finale est transmise en flux, sans messages de processus.true : les messages de narration entre les tours et le processus de raisonnement sont transmis caractère par caractère, et la réponse finale reste également incrémentale caractère par caractère. |
| ai_response | boolean | Non | Indique si l'IA répond à ce message. Par défaut true — l'omission de ce champ produit un comportement strictement identique aux appels existants.false : le message est uniquement archivé en base, l'IA ne répond pas, aucun token ni crédit n'est consommé, et la réponse est un accusé de réception léger.true : l'IA répond normalement ; en mode système de service client interne (Custom Helpdesk), passer explicitement true rend en outre la conversation à l'IA depuis l'état de transfert humain.false ; sinon équivaut à true. |
| human_agent_info | object | Non | Informations d'identité de l'agent, pertinentes uniquement lorsque messages contient role=human_agent (champ de premier niveau, un agent par requête). |
| name | string | Non | Nom de l'agent. |
| string | Non | E-mail de l'agent. | |
| image_url | string | Non | URL de l'avatar de l'agent. |
| conversation_config | object | Non | Permet aux développeurs d'ajuster temporairement le périmètre fonctionnel de l'agent pour cette conversation afin de répondre à des besoins spécifiques. |
| short_term_memory | boolean | Non | Interrupteur de mémoire à court terme. Active ou désactive la mémoire à court terme uniquement pour cette conversation. |
| long_term_memory | boolean | Non | Interrupteur de mémoire à long terme. Active ou désactive la mémoire à long terme uniquement pour cette conversation. |
| knowledge | object | Non | Périmètre de récupération des connaissances. Personnalisez la portée de récupération des connaissances pour cette conversation uniquement. Lorsque group_ids et data_ids sont tous deux fournis, la récupération s'effectue dans l'union de leurs bases de connaissances. Si les deux sont des tableaux vides, aucune connaissance n'est récupérée. Si le paramètre knowledge est omis, la configuration de connaissances par défaut de l'agent est utilisée.group_ids : Identifiants de bases de connaissances, pouvant contenir plusieurs documents de connaissances.data_ids : Identifiants de documents de connaissances dans la base de connaissances. |
| custom_variables | object | Non | Variables personnalisées. Permet aux développeurs d'ajuster temporairement les valeurs des variables personnalisées dans l'agent uniquement pour cette conversation. |
| thinking | boolean | Non | Contrôle le retour des informations de réflexion en streaming. |
| tool_call | boolean | Non | Contrôle le retour des informations d'appel d'outil en streaming. |
Note :
Les pages de configuration d'entrée et de sortie de l'agent prennent en charge différents schémas de reconnaissance pour différents types de messages. Les types et tailles de fichiers pris en charge varient. Adaptez les données de soumission API en conséquence. Formats de message pris en charge au maximum :
- Message texte : string
- Message audio : .mp3, .wav, .acc
- Message image : .jpg, .jpeg, .png, .gif, .webp
- Message document : .pdf, .txt, .docx, .csv, .xlsx, .html, .json, .md, .tex, .ts, .xml, etc.
Réponse
Exemple de réponse
{
"create_time": 1679587005,
"conversation_id": "657303a8a764d47094874bbe",
"user_id": "65a4ccfc7ce58e728d5897e0",
"anonymous_id": "device_abcdef123456",
"message_id": "65a4ccfC7ce58e728d5897e0",
"output": [
{
"from_component_branch": "1",
"from_component_name": "Nom du composant",
"content": {
"text": "Bonjour, puis-je vous aider ?",
"audio": [
{
"audio": "http://gptbots.ai/example.mp3",
"transcript": "Contenu audio transcrit"
}
]
}
}
],
"usage": {
"tokens": {
"total_tokens": 29,
"prompt_tokens": 19,
"prompt_tokens_details": {
"audio_tokens": 0,
"text_tokens": 0
},
"completion_tokens": 10,
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"text_tokens": 0
}
},
"credits": {
"total_credits": 0.0,
"text_input_credits": 0.0,
"text_output_credits": 0.0,
"audio_input_credits": 0.0,
"audio_output_credits": 0.0
}
},
"human_trigger": true
}
Exemple de réponse lorsque le transfert humain est déclenché
En mode système de service client interne (Custom Helpdesk), lorsque cette réponse déclenche un transfert vers un agent humain, human_trigger vaut true ; si une note de transfert existe également, un objet handoff est renvoyé en plus (ce champ est absent lorsqu'il n'y a pas de note).
{
"create_time": 1679587005,
"conversation_id": "657303a8a764d47094874bbe",
"user_id": "65a4ccfc7ce58e728d5897e0",
"anonymous_id": "device_abcdef123456",
"message_id": "65a4ccfC7ce58e728d5897e0",
"output": [
{
"from_component_branch": null,
"from_component_name": "AI Model-1",
"content": {
"text": "Transfert vers un agent humain en cours, veuillez patienter.",
"audio": null
}
}
],
"usage": {
"tokens": {
"total_tokens": 29,
"prompt_tokens": 19,
"prompt_tokens_details": {
"audio_tokens": 0,
"text_tokens": 19
},
"completion_tokens": 10,
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"text_tokens": 10
}
},
"credits": {
"total_credits": 0.0,
"text_input_credits": 0.0,
"text_output_credits": 0.0,
"audio_input_credits": 0.0,
"audio_output_credits": 0.0
}
},
"human_trigger": true,
"handoff": {
"note": "Motif du transfert : l'utilisateur a exprimé à deux reprises son mécontentement à propos du processus de remboursement et a demandé une prise en charge par un agent humain.\nRésumé de la conversation : l'utilisateur a passé une commande le 2 mars, n'a pas reçu de notification de remboursement après avoir demandé un remboursement, et a confirmé le numéro de commande 20260302-8891."
}
}
Réponse réussie (Blocking)
⚠️ En mode de réponse blocking, le service de transfert humain n'est pas disponible lors de l'intégration de systèmes de service client humain tiers tels que LiveChat ou Intercom (les messages des agents sont envoyés de manière asynchrone et nécessitent le mode webhook pour être reçus).
Cette restriction ne s'applique pas lors de l'utilisation du système de service client interne (Custom Helpdesk) : le signal de transfert humain est renvoyé viahuman_trigger/handoffdans le corps de la réponse, et les messages des agents sont écrits par le développeur via cette même API avecrole=human_agent.
| Champ | Type | Description |
|---|---|---|
| user_id | string | ID utilisateur lié par le développeur ; null lorsqu'aucun utilisateur n'est lié. |
| anonymous_id | string | ID de l'utilisateur anonyme (appareil). |
| conversation_id | string | Oui |
| message_id | string | Identifiant unique d'un message dans une conversation. |
| create_time | long | Horodatage de la génération de ce message de réponse. |
| output | JSON Array | Contenu de la réponse de l'agent. |
| from_component_branch | string | Branche de l'agent des flux. |
| from_component_name | string | Nom du composant amont dans l'agent des flux. |
| content | object | Contenu du message répondu par l'agent IA, inclut actuellement deux types de messages : text et audio. |
| human_trigger | boolean | Indique si cette réponse a déclenché un transfert humain. false lorsqu'il n'est pas déclenché. |
| handoff | object | Informations de transfert humain, présentes uniquement lorsque human_trigger vaut true et qu'une note de transfert existe. |
| note | string | Note de transfert (motif du transfert + résumé de la conversation), 2000 caractères maximum. |
| ai_response | boolean | Renvoyé dans l'accusé de réception des requêtes en archivage seul (ai_response=false ou contenant role=human_agent) pour confirmer que le message a été reconnu comme « archivage seul ». |
| sender_role | string | Renvoyé dans l'accusé de réception des requêtes en archivage seul ; sa valeur est human_agent ou user, pour confirmer le rôle du message archivé. |
| usage | object | Détails de la consommation de ressources. |
| tokens | JSON Array | Total des tokens consommés par l'agent dans cette conversation. |
| total_tokens | integer | Total des tokens consommés pour l'entrée et la sortie dans cette conversation. |
| prompt_tokens | integer | Total des tokens consommés pour l'entrée dans cette conversation. |
| completion_tokens | integer | Total des tokens consommés pour la sortie dans cette conversation. |
| prompt_tokens_details | object | Détail de la consommation de tokens pour l'entrée. |
| completion_tokens_details | object | Détail de la consommation de tokens pour la sortie. |
| credits | object | Total des crédits consommés par l'agent dans cette conversation. |
| text_input_credits | double | Crédits consommés pour les messages texte en entrée dans cette conversation. |
| text_output_credits | double | Crédits consommés pour les messages texte en sortie dans cette conversation. |
| audio_input_credits | double | Crédits consommés pour les messages audio en entrée dans cette conversation. |
| audio_output_credits | double | Crédits consommés pour les messages audio en sortie dans cette conversation. |
Réponse réussie (Streaming)
⚠️ En mode de réponse streaming, le service de transfert humain n'est pas disponible lors de l'intégration de systèmes de service client humain tiers tels que LiveChat ou Intercom (les messages des agents sont envoyés de manière asynchrone et nécessitent le mode webhook pour être reçus).
Cette restriction ne s'applique pas lors de l'utilisation du système de service client interne (Custom Helpdesk) : le déclenchement du transfert humain est envoyé sous forme de tramecode:36 HumanTrigger, et la note de transfert suit immédiatement sous forme de tramecode:107 HumanHandoffNote.
| Champ | Type | Description |
|---|---|---|
| code | int | Code du type de message : 3-Texte, 10-Sortie agent des flux, 0-Fin, 4-Données d'utilisation, 39-Message audio, Requête d'appel d'outil-5, Réponse d'appel d'outil-6, Réflexion-41, 36-Déclenchement du transfert humain, 107-Note de transfert humain. |
| message | string | Type de message : Texte, SortieFlux, Fin, HumanTrigger, HumanHandoffNote. |
| data | object | Contenu de la réponse. |
- Exemple de streaming de message texte :
{"code":11,"message":"MessageInfo","data":{"message_id":"6785dba0f06d872bff9ee347"}}
{"code":3,"message":"Text","data":"Comment "}
{"code":3,"message":"Text","data":"puis "}
{"code":3,"message":"Text","data":"je "}
{"code":3,"message":"Text","data":"vous "}
{"code":3,"message":"Text","data":"aider ?"}
{"code":0,"message":"End","data":null}
- Exemple de streaming de message audio :
{"code":11,"message":"MessageInfo","data":{"message_id":"67b857b6be1f2906861a5e75"}}
{"code":39,"message":"Audio","data":{"audioAnswer":"","transcript":"Bonjour"}}
{"code":39,"message":"Audio","data":{"audioAnswer":"EQAUAA0...IA3bi","transcript":""}}
{"code":0,"message":"End","data":null}
- Lorsqu'un transfert humain est déclenché en mode système de service client interne (Custom Helpdesk), la trame de déclenchement du transfert humain et la trame de note de transfert sont envoyées dans l'ordre, avant la trame
End:
{"code":3,"message":"Text","data":"Transfert vers un agent humain en cours, veuillez patienter."}
{"code":36,"message":"HumanTrigger","data":"HumanTrigger"}
{"code":107,"message":"HumanHandoffNote","data":{"note":"Motif du transfert : l'utilisateur a exprimé à deux reprises son mécontentement à propos du processus de remboursement et a demandé une prise en charge par un agent humain.\nRésumé de la conversation : l'utilisateur a passé une commande le 2 mars, n'a pas reçu de notification de remboursement après avoir demandé un remboursement, et a confirmé le numéro de commande 20260302-8891."}}
{"code":0,"message":"End","data":null}
Remarque :
code: 36, message: "HumanTrigger"indique que cette réponse a déclenché un transfert humain ;dataest une chaîne d'identifiant fixe.code: 107, message: "HumanHandoffNote"correspond à la note de transfert ; sa structuredataest identique au champhandoffde la réponse en mode blocking ({"note": "..."}).- La trame
HumanHandoffNoten'est envoyée que lorsqu'une note de transfert existe ; en l'absence de note, seule la trameHumanTriggerest présente — il n'y a pas de trame107vide. - Les deux trames sont toujours envoyées avant la trame
End(code: 0).
Réponse réussie (Webhook)
Une fois l'adresse du webhook configurée dans la section « Intégration-API », le système GPTBots enverra les messages « réponse de l'Agent » et « réponse du service client humain » à l'adresse du webhook.
Pour plus d'informations sur les messages webhook, veuillez consulter Réception de messages via Webhook et service de transfert humain.
⚠️ En mode API, si le service de transfert humain est activé, vous devez utiliser le mode de réponse webhook pour recevoir les messages de réponse du service client humain.
Réponse d'erreur
| Champ | Type | Description |
|---|---|---|
| code | int | Code d'erreur. |
| message | string | Détails de l'erreur. |
Exemple d'échec
{
"code": 40000,
"message": "Paramètres invalides",
"errors": [
{
"error_code": 40000,
"error_message": "Message user role type must have file or content."
}
],
"data": {
"create_time": 1679587005,
"conversation_id": "657303a8a764d47094874bbe",
"user_id": "65a4ccfc7ce58e728d5897e0",
"anonymous_id": "device_abcdef123456",
"message_id": "65a4ccfC7ce58e728d5897e0",
"output": [
{
"from_component_branch": "1",
"from_component_name": "Component Name",
"content": {
"text": "Réponse fournie en fonction du contenu reconnaissable……",
"audio": null
}
}
],
"usage": {
"tokens": {
"total_tokens": 29,
"prompt_tokens": 19,
"prompt_tokens_details": {
"audio_tokens": 0,
"text_tokens": 0
},
"completion_tokens": 10,
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"text_tokens": 0
}
},
"credits": {
"total_credits": 0,
"text_input_credits": 0,
"text_output_credits": 0,
"audio_input_credits": 0,
"audio_output_credits": 0
}
}
}
}
Codes d'erreur
| Code | Message |
|---|---|
| 40000 | Paramètres invalides |
| 40127 | Échec de l'authentification développeur |
| 40356 | La conversation n'existe pas |
| 40358 | Incohérence de l'identifiant de conversation |
| 40364 | L'agent ne prend pas en charge le mode image |
| 50000 | Erreur interne du système |
| 20040 | Limite de longueur de question dépassée |
| 20022 | Crédits insuffisants |
| 20055 | Utilisation de l'API interdite, assurez-vous que l'interrupteur API est activé |
