POST/v1/chat
Recevoir une réponse de l’assistant en flux (SSE)
chat
Avec plusieurs copies de l’API derrière un répartiteur de charge (l’adresse api.<domain>, 1.62.0), une réponse et le tampon de ses événements résident dans la mémoire de la copie qui la génère. La reprise du flux avec Last-Event-ID ne fonctionne que sur cette copie.
Une requête répétée avec le même request_id et la même conversation qui atteint une autre copie après la fin de la réponse reçoit la réponse enregistrée (token et done, événements numérotés à partir de 1) sans que la question soit posée de nouveau. Une requête répétée qui atteint une autre copie pendant la génération de la réponse arrête cette génération et construit la réponse à nouveau ; aucune seconde question n’est créée non plus. Pour reprendre le flux sans nouvelle génération, conservez la connexion à la même copie ou répétez la requête après l’événement done.
Authentification
Envoyez une clé API dans l’en-tête Authorization : Authorization: Bearer <clé>.
Paramètres d’en-tête
X-View-AsstringUniquement pour les clés API ayant le rôle
admin. Exécute la requête avec le profil de données<profile>[:viewer|verifier|editor], par exempleemployee:viewer. La clé d’installation ne peut pas utiliser cet en-tête (403).
Paramètres de cookie
kb_view_asstringCookie du mode « View as » pour une session.
POST /auth/view-asle définit etDELETE /auth/view-asle supprime.
Corps de la requête
application/json
items ≥ 1
collectionstringPar défaut : "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanPar défaut : false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNe pas prendre la réponse dans le cache des réponses (le bouton « Get a fresh answer » sous une réponse en cache). La nouvelle réponse remplace l’entrée en cache.
Par défaut : false
languagestring | nullLangue de la réponse : un code ISO 639-1 (
de,en,ru, …) pour répondre dans cette langue. Avecautoou sans le champ, la langue est déduite de la question. L’interface transmet explicitement la langue d’une suggestion rédigée dans une autre langue (Starter.language).scopeChatScope | nullPérimètre de la question : plusieurs collections, une source, des étiquettes et une période. Les collections du périmètre remplacent
collection. Une source restreint la réponse à sa collection (et à ses propres fiches). Les étiquettes s’ajoutent àtags. La période limite les réponses financières à cette période. Vous ne pouvez sélectionner que ce que l’utilisateur voit (collections :collections.no_access/collections.not_found; source :sources.not_found). Avecconversation_id, le périmètre est enregistré dans la conversation. Sans le champ, le périmètre de la conversation s’applique ;nullou un périmètre vide l’efface.request_idstringClé d’idempotence de la question. Envoyez la même clé à chaque nouvelle tentative du flux pour une même question (nouvelle tentative après une déconnexion ; ici,
Last-Event-IDne reprend pas le flux et est seulement journalisé). Une nouvelle tentative avec la clé d’une réponse déjà enregistrée ne crée pas de seconde question : le résultat enregistré est renvoyé sous la forme d’un seul événementdone(et d’untokenavec le texte), même si la limite de questions ou de crédits est épuisée. Si la réponse précédente est encore en cours de génération pour un client déconnecté, cette génération s’arrête et la réponse est générée à nouveau.length ≤ 64
version_ofinteger (int64)Crée une nouvelle version de l’échange de cette question dans la conversation (
question_idissu du fil) : une question modifiée (nouveau texte dansmessages), une réponse régénérée (le même texte, généralement avecbypass_cache) ou la même question avec une autrequality(par exemplepreciseaprès une réponsefast). La paire question-réponse précédente est conservée. Les échanges qui la suivent restent dans sa branche et sont masqués du fil tant que la nouvelle version est sélectionnée (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). L’historique utilisé pour la réponse est la branche sélectionnée jusqu’à cet échange. Laqualityd’une version ne modifie pas les paramètres de la conversation. Nécessiteconversation_id; une question d’une autre conversation renvoie404 questions.not_found.qualitystringÉquilibre entre la rapidité et la précision de la recherche qui produit le résultat :
fastest plus rapide,preciseplus précis. Par défaut :precise.Valeurs autorisées:
fastprecise
Réponses
200Avec `stream=true` : `text/event-stream`. Chaque événement se compose des lignes `id: <number>` (le numéro de séquence de l’événement dans le flux, à partir de 1) et `data: <JSON>`, suivies d’une ligne vide. Les champs `event:` et `retry:` ne sont pas utilisés ; le type d’événement figure dans le champ `type` (`ChatEvent`).
Avec stream=true : text/event-stream. Chaque événement se compose des lignes id: <number> (le numéro de séquence de l’événement dans le flux, à partir de 1) et data: <JSON>, suivies d’une ligne vide. Les champs event: et retry: ne sont pas utilisés ; le type d’événement figure dans le champ type (ChatEvent).
Une question avec request_id reçoit sa réponse indépendamment de la connexion. Une déconnexion n’arrête pas la réponse : elle est terminée et enregistrée dans la conversation (pendant 10 minutes au plus). Répéter la même requête (même request_id et même conversation) rattache le client à la réponse en cours, et avec l’en-tête Last-Event-ID, la requête reçoit les événements qui suivent ce numéro : le flux continue donc avec les mêmes numéros d’événements. Si le flux ne peut pas reprendre à partir de ce numéro, la requête répétée reçoit le flux depuis le début : le premier événement porte alors un numéro inférieur ou égal à Last-Event-ID, et le client reprend la réponse depuis le début. Si la réponse est déjà terminée et que le tampon de ses événements a été libéré (au bout de 3 minutes), le résultat enregistré est renvoyé (token et done, numérotés à partir de 1) sans que la question soit posée de nouveau ; sinon, la réponse est générée à nouveau. Pour arrêter une telle réponse, appelez POST /v1/chat/cancel. Sans request_id, une déconnexion du client annule la réponse.
Après le premier événement, tant que la réponse est en cours, le serveur envoie un commentaire : ping toutes les 15 secondes ; ignorez-le. Ordre des événements : événements stage (progression), meta, sources, data, puis le texte de la réponse dans des événements token, puis done. Avant le texte de la réponse, sources et data peuvent se répéter et des événements tool peuvent apparaître ; le texte peut arriver en un seul token ou en plusieurs parties. Une réponse en cache : meta (avec cached), sources, data, token, done. Une erreur survenue après le début du flux arrive sous forme d’événement error, et le flux se ferme sans done ; le statut HTTP du flux est toujours 200. Après done, un événement followups avec des suggestions de questions suivantes peut arriver. Ignorez les types d’événements que vous ne traitez pas.
Avec stream=false : application/json avec un corps AnswerResponse (plus conversation_id).
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
text/event-stream
application/json
answerstringobligatoirequestion_idintegerobligatoirequerystringcollectionstringobligatoireprovenancearray of NumberProvenanceemptystringValeurs autorisées:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullRaison de l’utilisation d’outils pour cette réponse :
request(demandé explicitement) ;compare,compute,action(selon la question) ;needs_calc(un calcul sur des tableaux est nécessaire) ;summary(une vue d’ensemble d’une collection ou de documents) ;mcp(l’organisation a connecté des serveurs MCP externes).Valeurs autorisées:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringUniquement pour
POST /v1/chatavec une conversation.answer_idstringID de l’objet réponse.
400La requête est invalide : la valeur d’un paramètre ou l’état de l’objet ne permet pas l’action (`detail` est un message).
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
401Aucun identifiant n’a été envoyé (ni cookie de session ni clé API), ou la clé est introuvable.
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
403L’action n’est pas autorisée : le rôle est insuffisant, il n’y a pas d’accès à la collection ou à la fiche, la requête s’exécute en mode « View as », ou l’organisation est suspendue ou supprimée (`detail` est un objet avec `code: org_suspended | org_deleted`).
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
404L’objet n’existe pas ou ne vous est pas accessible. L’API ne confirme pas l’existence d’un objet à accès restreint.
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
422Erreur de validation : le corps ou les paramètres ne correspondent pas au schéma (`detail` est une liste d’erreurs de validation), ou la valeur d’un paramètre est hors des limites admises (`detail` est un message).
En-têtes de la réponse
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
429Trop de requêtes (`api.rate_limited`), quota de l’organisation pour la minute, le jour ou le mois épuisé (`api.quota_exceeded` ; `error.details` contient `quota`, `limit` et `reset_at`), limite de l’organisation atteinte, ou service de réponses occupé (`answers.engine_busy`). Attendez le délai indiqué dans l’en-tête `Retry-After`.
En-têtes de la réponse
Retry-AfterNombre de secondes à attendre avant de réessayer la requête.
RateLimit-PolicyLimites en vigueur, au format du brouillon IETF
draft-ietf-httpapi-ratelimit-headers: éléments séparés par des virgules"<name>";q=<quota>;w=<window in seconds>.keyest le débit de requêtes de la clé API (le quota est la rafale, la fenêtre est le temps nécessaire pour la reconstituer entièrement ; pour une session, c’estuser, sans identifiants,ip) ;minute,dayetmonthsont les quotas de l’organisation pour la minute, le jour et le mois calendaires en UTC.RateLimitCe qui reste de chaque limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite de l’entrée la plus stricte de
RateLimit-Policy(celle à laquelle il reste le moins de requêtes).X-RateLimit-RemainingRequêtes restantes au titre de la limite la plus stricte.
X-RateLimit-ResetSecondes restantes avant la réinitialisation de la limite la plus stricte.
application/json
Codes d’erreur
Codes que ce point de terminaison peut renvoyer dans error.code, en plus des codes généraux communs à toutes les requêtes.
- 400answers.empty_question
- 409answers.external_ai_disabled
- 400answers.last_message_not_user
- 404answers.no_collections
- 422answers.scope_invalid
- 401auth.not_authenticated
- 403auth.system_scope
- 403collections.no_access
- 404collections.not_found
- 404conversations.not_found
- 422conversations.title_empty
- 429limits.concurrent_answers
- 429limits.questions
- 403org.deleted
- 403org.suspended
- 404sources.not_found
- 403view_as.read_only
Nouvelles tentatives sans risque
Envoyez un en-tête Idempotency-Key (par exemple un UUID) avec chaque POST et PATCH. Une nouvelle tentative avec la même clé dans les 24 heures renvoie la réponse enregistrée au lieu d’exécuter à nouveau la requête.
Limites de débit
Les réponses portent les en-têtes RateLimit et RateLimit-Policy, ainsi que les anciens X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset. Une réponse 429 contient Retry-After en secondes : attendez, puis réessayez.