POST/v1/chat
Transmitir una respuesta del asistente (SSE)
chat
Con varias copias de la API detrás de un balanceador de carga (la dirección api.<domain>, 1.62.0), una respuesta y el búfer de sus eventos están en la memoria de la copia que la genera. Reanudar el flujo con Last-Event-ID solo funciona en esa copia.
Una solicitud repetida con el mismo request_id y la misma conversación que llega a otra copia después de que la respuesta haya terminado recibe la respuesta guardada (token y done, con los eventos numerados desde 1) sin volver a hacer la pregunta. Una solicitud repetida que llega a otra copia mientras la respuesta aún se está generando detiene esa generación y construye la respuesta de nuevo; tampoco en este caso se crea una segunda pregunta. Para reanudar el flujo sin una generación nueva, mantenga la conexión con la misma copia o repita la solicitud después del evento done.
Autenticación
Envíe una clave de API en el encabezado Authorization: Authorization: Bearer <clave>.
Parámetros de encabezado
X-View-AsstringSolo para claves de API con el rol
admin. Ejecuta la solicitud como el perfil de datos<profile>[:viewer|verifier|editor], por ejemploemployee:viewer. La clave de instalación no puede usar este encabezado (403).
Parámetros de cookie
kb_view_asstringCookie del modo «View as» para una sesión.
POST /auth/view-asla establece yDELETE /auth/view-asla elimina.
Cuerpo de la solicitud
application/json
items ≥ 1
collectionstringPredeterminado: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanPredeterminado: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNo tomar la respuesta de la caché de respuestas (el botón «Get a fresh answer» —obtener una respuesta nueva— bajo una respuesta en caché). La respuesta nueva sustituye la entrada en caché.
Predeterminado: false
languagestring | nullIdioma de la respuesta: un código ISO 639-1 (
de,en,ru, …) para responder en ese idioma. Conautoo sin el campo, el idioma se detecta a partir de la pregunta. La interfaz envía de forma explícita el idioma de una sugerencia en otro idioma (Starter.language).scopeChatScope | nullAlcance de la pregunta: varias colecciones, una fuente, etiquetas y un período. Las colecciones del alcance sustituyen a
collection. Una fuente limita la respuesta a su colección (y a sus propias tarjetas). Las etiquetas se añaden atags. El período limita las respuestas financieras a ese período. Solo se puede seleccionar lo que el usuario puede ver (colecciones:collections.no_access/collections.not_found; fuente:sources.not_found). Conconversation_id, el alcance se guarda en la conversación. Sin el campo, se aplica el alcance de la conversación;nullo un alcance vacío lo borra.request_idstringClave de idempotencia de la pregunta. Envíe la misma clave en cada reintento del flujo de una misma pregunta (un reintento tras una desconexión; aquí
Last-Event-IDno continúa el flujo y solo se registra). Un reintento con la clave de una respuesta ya guardada no crea una segunda pregunta: el resultado guardado se envía de nuevo como un único eventodone(y untokencon el texto), aunque se haya agotado el límite de preguntas o de créditos. Si la respuesta anterior todavía se está generando para un cliente desconectado, esa generación se detiene y la respuesta se genera de nuevo.length ≤ 64
version_ofinteger (int64)Crea una versión nueva del turno de esta pregunta en la conversación (
question_iddel historial de la conversación): una pregunta editada (texto nuevo enmessages), una respuesta regenerada (el mismo texto, normalmente conbypass_cache) o la misma pregunta con otroquality(por ejemplo,precisedespués de una respuestafast). Se conserva el par anterior de pregunta y respuesta. Los turnos posteriores permanecen en su rama y se ocultan del historial mientras está seleccionada la versión nueva (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). El historial que se usa para la respuesta es la rama seleccionada hasta este turno. Elqualityde una versión no cambia la configuración de la conversación. Requiereconversation_id; una pregunta de otra conversación devuelve404 questions.not_found.qualitystringEquilibrio entre velocidad y precisión de la búsqueda en la que se basa el resultado:
fastes más rápido,precisees más preciso. Predeterminado:precise.Valores permitidos:
fastprecise
Respuestas
200Con `stream=true`: `text/event-stream`. Cada evento consta de las líneas `id: <number>` (el número de orden del evento en el flujo, empezando por 1) y `data: <JSON>`, seguidas de una línea vacía. Los campos `event:` y `retry:` no se usan; el tipo de evento está en el campo `type` (`ChatEvent`).
Con stream=true: text/event-stream. Cada evento consta de las líneas id: <number> (el número de orden del evento en el flujo, empezando por 1) y data: <JSON>, seguidas de una línea vacía. Los campos event: y retry: no se usan; el tipo de evento está en el campo type (ChatEvent).
Una pregunta con request_id se responde con independencia de la conexión. Una desconexión no detiene la respuesta: se completa y se guarda en la conversación (durante un máximo de 10 minutos). Una repetición de la misma solicitud (el mismo request_id y la misma conversación) se une a la respuesta en curso y, con el encabezado Last-Event-ID, recibe los eventos posteriores a ese número, de modo que el flujo continúa con los mismos números de evento. Si el flujo no puede continuar desde ese número, la solicitud repetida recibe el flujo desde el principio: el primer evento tiene entonces un número no mayor que Last-Event-ID, y el cliente empieza la respuesta de nuevo. Si la respuesta ya ha terminado y su búfer de eventos se ha liberado (al cabo de 3 minutos), se vuelve a enviar el resultado guardado (token y done, numerados desde 1) sin volver a hacer la pregunta; en otro caso, la respuesta se genera de nuevo. Para detener una respuesta así, llame a POST /v1/chat/cancel. Sin request_id, una desconexión del cliente cancela la respuesta.
Tras el primer evento, mientras la respuesta está en curso, el servidor envía un comentario : ping cada 15 segundos; ignórelo. Orden de los eventos: eventos stage (progreso), meta, sources, data, después el texto de la respuesta en eventos token y, por último, done. Antes del texto de la respuesta, sources y data pueden repetirse y pueden aparecer eventos tool; el texto puede llegar en un solo token o en partes. Una respuesta en caché: meta (con cached), sources, data, token, done. Un error después de que el flujo haya empezado llega como evento error, y el flujo se cierra sin done; el estado HTTP del flujo es siempre 200. Después de done puede llegar un evento followups con preguntas siguientes sugeridas. Ignore los tipos de evento que no gestione.
Con stream=false: application/json con un cuerpo AnswerResponse (más conversation_id).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
text/event-stream
application/json
answerstringobligatorioquestion_idintegerobligatorioquerystringcollectionstringobligatorioprovenancearray of NumberProvenanceemptystringValores permitidos:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullPor qué se usaron herramientas en esta respuesta:
request(se pidieron de forma explícita);compare,compute,action(según la pregunta);needs_calc(hace falta un cálculo sobre tablas);summary(una visión general de una colección o de documentos);mcp(la organización ha conectado servidores MCP externos).Valores permitidos:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringSolo en
POST /v1/chatcon una conversación.answer_idstringID del objeto de la respuesta.
400La solicitud no es válida: el valor de un parámetro o el estado del objeto no permiten la acción (`detail` es un mensaje).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
401No se enviaron credenciales (ni una cookie de sesión ni una clave de API) o no se encontró la clave.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
403La acción no está permitida: el rol no es suficiente, no hay acceso a la colección o a la tarjeta, la solicitud se ejecuta en modo «View as», o la organización está suspendida o eliminada (`detail` es un objeto con `code: org_suspended | org_deleted`).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
404El objeto no existe o no está disponible para usted. La API no confirma la existencia de un objeto restringido.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
422Error de validación: el cuerpo o los parámetros no coinciden con el esquema (`detail` es una lista de errores de validación), o el valor de un parámetro está fuera del rango permitido (`detail` es un mensaje).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
429Demasiadas solicitudes (`api.rate_limited`), se agotó la cuota de la organización para el minuto, el día o el mes (`api.quota_exceeded`; `error.details` contiene `quota`, `limit` y `reset_at`), se alcanzó el límite de la organización o el servicio de respuestas está ocupado (`answers.engine_busy`). Espere el tiempo indicado en el encabezado `Retry-After`.
Encabezados de la respuesta
Retry-AfterNúmero de segundos que hay que esperar antes de reintentar la solicitud.
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
Códigos de error
Códigos que este endpoint puede devolver en error.code, además de los códigos generales de cualquier solicitud.
- 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
Reintentos seguros
Envíe un encabezado Idempotency-Key (por ejemplo, un UUID) con cada POST y PATCH. Un reintento con la misma clave en un plazo de 24 horas devuelve la respuesta guardada en lugar de volver a ejecutar la solicitud.
Límites de frecuencia
Las respuestas incluyen los encabezados RateLimit y RateLimit-Policy y los anteriores X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. Una respuesta 429 lleva Retry-After en segundos: espere y vuelva a intentarlo.