POST/v1/chat
Transmetre en temps real una resposta de l’assistent (SSE)
chat
Amb diverses còpies de l’API darrere d’un balancejador de càrrega (l’adreça api.<domain>, 1.62.0), una resposta i la memòria intermèdia dels seus esdeveniments són a la memòria de la còpia que la genera. Reprendre el flux amb Last-Event-ID només funciona en aquella còpia.
Una sol·licitud repetida amb el mateix request_id i la mateixa conversa que arriba a una altra còpia quan la resposta ja ha acabat rep la resposta desada (token i done, amb els esdeveniments numerats des d’1) sense tornar a fer la pregunta. Una sol·licitud repetida que arriba a una altra còpia mentre la resposta encara s’està generant atura aquella generació i construeix la resposta de nou; tampoc no es crea una segona pregunta. Per reprendre el flux sense una generació nova, mantingueu la connexió amb la mateixa còpia o repetiu la sol·licitud després de l’esdeveniment done.
Autenticació
Envieu una clau d’API a la capçalera Authorization: Authorization: Bearer <clau>.
Paràmetres de capçalera
X-View-AsstringNomés per a claus d’API amb el rol
admin. Fa la sol·licitud com el perfil de dades<profile>[:viewer|verifier|editor], per exempleemployee:viewer. La clau d’instal·lació no pot fer servir aquesta capçalera (403).
Paràmetres de galeta
kb_view_asstringGaleta del mode «View as» per a una sessió.
POST /auth/view-asl’estableix iDELETE /auth/view-asl’esborra.
Cos de la sol·licitud
application/json
items ≥ 1
collectionstringPer defecte: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanPer defecte: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNo pren la resposta de la memòria cau de respostes (el botó «Get a fresh answer» —obtenir una resposta nova— sota una resposta de la memòria cau). La resposta nova substitueix l’element de la memòria cau.
Per defecte: false
languagestring | nullLlengua de la resposta: un codi ISO 639-1 (
de,en,ru, …) per respondre en aquesta llengua. Ambautoo sense el camp, la llengua es detecta a partir de la pregunta. La interfície passa explícitament la llengua d’un suggeriment en una altra llengua (Starter.language).scopeChatScope | nullAbast de la pregunta: diverses col·leccions, una font, etiquetes i un període. Les col·leccions de l’abast substitueixen
collection. Una font restringeix la resposta a la seva col·lecció (i a les seves pròpies entrades). Les etiquetes s’afegeixen atags. El període limita les respostes financeres a aquest període. Només es pot seleccionar el que l’usuari pot veure (col·leccions:collections.no_access/collections.not_found; font:sources.not_found). Ambconversation_id, l’abast es desa a la conversa. Sense el camp, s’aplica l’abast de la conversa;nullo un abast buit l’esborra.request_idstringClau d’idempotència de la pregunta. Envieu la mateixa clau en cada reintent del flux per a una mateixa pregunta (un reintent després d’una desconnexió; aquí
Last-Event-IDno continua el flux i només es registra). Un reintent amb la clau d’una resposta que ja s’ha desat no crea una segona pregunta: el resultat desat es torna a enviar com un sol esdevenimentdone(i untokenamb el text), encara que s’hagi esgotat el límit de preguntes o de crèdits. Si la resposta anterior encara s’està generant per a un client desconnectat, aquesta generació s’atura i la resposta es torna a generar.length ≤ 64
version_ofinteger (int64)Crea una versió nova del torn d’aquesta pregunta a la conversa (
question_idde l’historial): una pregunta editada (text nou amessages), una resposta regenerada (el mateix text, normalment ambbypass_cache) o la mateixa pregunta amb un altre valor dequality(per exemple,precisedesprés d’una respostafast). Es conserva la parella anterior de pregunta i resposta. Els torns posteriors es queden a la seva branca i s’amaguen de l’historial mentre la versió nova està seleccionada (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). L’historial que es fa servir per a la resposta és la branca seleccionada fins a aquest torn. El valor dequalityd’una versió no canvia la configuració de la conversa. Requereixconversation_id; una pregunta d’una altra conversa retorna404 questions.not_found.qualitystringEquilibri entre la velocitat i la precisió de la cerca en què es basa el resultat:
fastés més ràpida,preciseés més precisa. Per defecte:precise.Valors permesos:
fastprecise
Respostes
200Amb `stream=true`: `text/event-stream`. Cada esdeveniment consta de les línies `id: <number>` (el número d’ordre de l’esdeveniment al flux, començant per 1) i `data: <JSON>`, seguides d’una línia buida. Els camps `event:` i `retry:` no s’utilitzen; el tipus d’esdeveniment és al camp `type` (`ChatEvent`).
Amb stream=true: text/event-stream. Cada esdeveniment consta de les línies id: <number> (el número d’ordre de l’esdeveniment al flux, començant per 1) i data: <JSON>, seguides d’una línia buida. Els camps event: i retry: no s’utilitzen; el tipus d’esdeveniment és al camp type (ChatEvent).
Una pregunta amb request_id es respon independentment de la connexió. Una desconnexió no atura la resposta: es completa i es desa a la conversa (durant un màxim de 10 minuts). Repetir la mateixa sol·licitud (el mateix request_id i la mateixa conversa) s’uneix a la resposta en curs i, amb la capçalera Last-Event-ID, rep els esdeveniments posteriors a aquest número, de manera que el flux continua amb els mateixos números d’esdeveniment. Si el flux no pot continuar des d’aquest número, la sol·licitud repetida rep el flux des del començament: aleshores el primer esdeveniment té un número que no és més gran que Last-Event-ID, i el client torna a començar la resposta. Si la resposta ja ha acabat i la memòria intermèdia dels seus esdeveniments s’ha alliberat (al cap de 3 minuts), el resultat desat s’envia de nou (token i done, numerats des d’1) sense tornar a fer la pregunta; si no, la resposta es genera de nou. Per aturar una resposta d’aquest tipus, crideu POST /v1/chat/cancel. Sense request_id, una desconnexió del client cancel·la la resposta.
Després del primer esdeveniment, mentre la resposta està en curs, el servidor envia un comentari : ping cada 15 segons; ometeu-lo. Ordre dels esdeveniments: esdeveniments stage (progrés), meta, sources, data, després el text de la resposta en esdeveniments token i, finalment, done. Abans del text de la resposta, sources i data es poden repetir i poden aparèixer esdeveniments tool; el text pot arribar en un sol token o en parts. Una resposta de la memòria cau: meta (amb cached), sources, data, token, done. Un error després que el flux hagi començat arriba com a esdeveniment error, i el flux es tanca sense done; l’estat HTTP del flux sempre és 200. Després de done, pot arribar un esdeveniment followups amb les preguntes següents suggerides. Ignoreu els tipus d’esdeveniment que no tracteu.
Amb stream=false: application/json amb un cos AnswerResponse (més conversation_id).
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
text/event-stream
application/json
answerstringobligatoriquestion_idintegerobligatoriquerystringcollectionstringobligatoriprovenancearray of NumberProvenanceemptystringValors permesos:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullPer què s’han fet servir eines per a aquesta resposta:
request(s’ha demanat explícitament);compare,compute,action(segons la pregunta);needs_calc(cal un càlcul sobre taules);summary(una visió general d’una col·lecció o de documents);mcp(l’organització ha connectat servidors MCP externs).Valors permesos:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringNomés per a
POST /v1/chatamb una conversa.answer_idstringID de l’objecte de la resposta.
400La sol·licitud no és vàlida: el valor d’un paràmetre o l’estat de l’objecte no permeten l’acció (`detail` és un missatge).
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
401No s’han enviat credencials (ni una galeta de sessió ni una clau d’API), o no s’ha trobat la clau.
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
403L’acció no està permesa: el rol és insuficient, no hi ha accés a la col·lecció o a l’entrada, la sol·licitud s’executa en mode «View as», o l’organització està suspesa o eliminada (`detail` és un objecte amb `code: org_suspended | org_deleted`).
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
404L’objecte no existeix o no està disponible per a vós. L’API no confirma que existeixi un objecte restringit.
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
422Error de validació: el cos o els paràmetres no coincideixen amb l’esquema (`detail` és una llista d’errors de validació), o el valor d’un paràmetre és fora de l’interval permès (`detail` és un missatge).
Capçaleres de la resposta
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
429Massa sol·licituds (`api.rate_limited`), s’ha esgotat la quota de l’organització per al minut, el dia o el mes (`api.quota_exceeded`; `error.details` conté `quota`, `limit` i `reset_at`), s’ha arribat al límit de l’organització o el servei de respostes està ocupat (`answers.engine_busy`). Espereu el temps que indica la capçalera `Retry-After`.
Capçaleres de la resposta
Retry-AfterNombre de segons que cal esperar abans de reintentar la sol·licitud.
RateLimit-PolicyLímits vigents, en el format de l’esborrany de l’IETF
draft-ietf-httpapi-ratelimit-headers: elements separats per comes"<name>";q=<quota>;w=<window in seconds>.keyés la freqüència de sol·licituds de la clau d’API (la quota és la ràfega, la finestra és el temps que triga a reomplir-se del tot; per a una sessió ésuser, sense credencialsip);minute,dayimonthsón les quotes de l’organització per al minut, el dia i el mes naturals en UTC.RateLimitEl que queda de cada límit de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímit de l’element més restrictiu de
RateLimit-Policy(el que té menys sol·licituds restants).X-RateLimit-RemainingSol·licituds restants dins del límit més restrictiu.
X-RateLimit-ResetSegons que falten perquè es restableixi el límit més restrictiu.
application/json
Codis d’error
Codis que aquest punt final pot retornar a error.code, a més dels codis generals de totes les sol·licituds.
- 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
Reintents segurs
Envieu una capçalera Idempotency-Key (per exemple, un UUID) amb cada POST i PATCH. Un reintent amb la mateixa clau en un termini de 24 hores retorna la resposta desada en lloc de tornar a executar la sol·licitud.
Límits de freqüència
Les respostes porten les capçaleres RateLimit i RateLimit-Policy i les anteriors X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset. Una resposta 429 té Retry-After en segons: espereu i torneu-ho a provar.