POST/v1/chat
Transmitir uma resposta do assistente (SSE)
chat
Com várias cópias da API atrás de um balanceador de carga (o endereço api.<domain>, versão 1.62.0), uma resposta e o buffer dos eventos dela ficam na memória da cópia que a gera. Retomar o stream com Last-Event-ID só funciona nessa cópia.
Uma requisição repetida com o mesmo request_id e a mesma conversa que chega a outra cópia depois de a resposta terminar recebe a resposta salva (token e done, eventos numerados a partir de 1) sem fazer a pergunta de novo. Uma requisição repetida que chega a outra cópia enquanto a resposta ainda está sendo gerada interrompe essa geração e monta a resposta do zero; também não se cria uma segunda pergunta. Para retomar o stream sem nova geração, mantenha a conexão com a mesma cópia ou repita a requisição depois do evento done.
Autenticação
Envie uma chave de API no cabeçalho Authorization: Authorization: Bearer <chave>.
Parâmetros de cabeçalho
X-View-AsstringSó para chaves de API com a função
admin. Faz a requisição como o perfil de dados<profile>[:viewer|verifier|editor], por exemplo,employee:viewer. A chave de instalação não pode usar este cabeçalho (403).
Parâmetros de cookie
kb_view_asstringCookie do modo “View as” (ver a base como um perfil de dados a vê) de uma sessão.
POST /auth/view-aso define eDELETE /auth/view-aso remove.
Corpo da requisição
application/json
items ≥ 1
collectionstringPadrão: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanPadrão: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNão usar a resposta do cache de respostas (o botão “Get a fresh answer” (obter uma resposta nova) sob uma resposta do cache). A resposta nova substitui a entrada do cache.
Padrão: false
languagestring | nullIdioma da resposta: um código ISO 639-1 (
de,en,ru, …) para responder nesse idioma. Comautoou sem o campo, o idioma é detectado a partir da pergunta. A interface passa explicitamente o idioma de uma sugestão em outro idioma (Starter.language).scopeChatScope | nullAbrangência da pergunta: várias coleções, uma fonte, etiquetas e um período. As coleções da abrangência substituem
collection. Uma fonte restringe a resposta à coleção dela (e aos cartões dela). As etiquetas são acrescentadas atags. O período limita as respostas financeiras a esse período. Só é possível selecionar o que o usuário pode ver (coleções:collections.no_access/collections.not_found; fonte:sources.not_found). Comconversation_id, a abrangência é salva na conversa. Sem o campo, vale a abrangência da conversa;nullou uma abrangência vazia a limpa.request_idstringChave de idempotência da pergunta. Envie a mesma chave em cada nova tentativa do stream de uma pergunta (uma nova tentativa após uma desconexão; aqui
Last-Event-IDnão continua o stream e só é registrado). Uma nova tentativa com a chave de uma resposta já salva não cria uma segunda pergunta: o resultado salvo é enviado de novo como um único eventodone(e umtokencom o texto), mesmo que o limite de perguntas ou de créditos tenha se esgotado. Se a resposta anterior ainda estiver sendo gerada para um cliente desconectado, essa geração para e a resposta é gerada de novo.length ≤ 64
version_ofinteger (int64)Cria uma nova versão do turno desta pergunta na conversa (
question_iddo histórico da conversa): uma pergunta editada (novo texto emmessages), uma resposta gerada de novo (o mesmo texto, em geral combypass_cache) ou a mesma pergunta com outroquality(por exemplo,precisedepois de uma respostafast). O par anterior de pergunta e resposta é mantido. Os turnos posteriores ficam no ramo dele e são ocultados do histórico enquanto a nova versão estiver selecionada (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). O histórico usado para a resposta é o ramo selecionado até este turno. Oqualityde uma versão não altera as configurações da conversa. Requerconversation_id; uma pergunta de outra conversa retorna404 questions.not_found.qualitystringEquilíbrio entre velocidade e precisão da busca por trás do resultado:
fasté mais rápido,preciseé mais preciso. Padrão:precise.Valores permitidos:
fastprecise
Respostas
200Com `stream=true`: `text/event-stream`. Cada evento é formado pelas linhas `id: <number>` (o número sequencial do evento no stream, a partir de 1) e `data: <JSON>`, seguidas de uma linha vazia. Os campos `event:` e `retry:` não são usados; o tipo do evento fica no campo `type` (`ChatEvent`).
Com stream=true: text/event-stream. Cada evento é formado pelas linhas id: <number> (o número sequencial do evento no stream, a partir de 1) e data: <JSON>, seguidas de uma linha vazia. Os campos event: e retry: não são usados; o tipo do evento fica no campo type (ChatEvent).
Uma pergunta com request_id é respondida independentemente da conexão. Uma desconexão não interrompe a resposta: ela é concluída e salva na conversa (por até 10 minutos). Repetir a mesma requisição (o mesmo request_id e a mesma conversa) conecta à resposta em andamento e, com o cabeçalho Last-Event-ID, recebe os eventos posteriores a esse número, de modo que o stream continua com os mesmos números de evento. Se o stream não puder continuar a partir desse número, a requisição repetida recebe o stream desde o início: o primeiro evento tem então um número não maior que Last-Event-ID, e o cliente recomeça a resposta. Se a resposta já terminou e o buffer de eventos dela foi liberado (após 3 minutos), o resultado salvo é enviado de novo (token e done, numerados a partir de 1) sem fazer a pergunta de novo; caso contrário, a resposta é gerada do zero. Para interromper essa resposta, chame POST /v1/chat/cancel. Sem request_id, uma desconexão do cliente cancela a resposta.
Depois do primeiro evento, enquanto a resposta está em andamento, o servidor envia um comentário : ping a cada 15 segundos; ignore-o. Ordem dos eventos: eventos stage (progresso), meta, sources, data, depois o texto da resposta em eventos token e, por fim, done. Antes do texto da resposta, sources e data podem se repetir, e eventos tool podem aparecer; o texto pode chegar como um único token ou em partes. Uma resposta em cache: meta (com cached), sources, data, token, done. Um erro depois que o stream começou chega como um evento error, e o stream é fechado sem done; o status HTTP do stream é sempre 200. Depois de done, pode chegar um evento followups com sugestões de próximas perguntas. Ignore os tipos de evento que você não trata.
Com stream=false: application/json com um corpo AnswerResponse (mais conversation_id).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
text/event-stream
application/json
answerstringobrigatórioquestion_idintegerobrigatórioquerystringcollectionstringobrigatórioprovenancearray 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 que foram usadas ferramentas nesta resposta:
request(pedido explicitamente);compare,compute,action(com base na pergunta);needs_calc(é preciso um cálculo sobre tabelas);summary(uma visão geral de uma coleção ou de documentos);mcp(a organização conectou servidores MCP externos).Valores permitidos:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringSó para
POST /v1/chatcom uma conversa.answer_idstringID do objeto da resposta.
400A requisição é inválida: o valor de um parâmetro ou o estado do objeto não permite a ação (`detail` é uma mensagem).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
401Nenhuma credencial foi enviada (nem cookie de sessão nem chave de API), ou a chave não foi encontrada.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
403A ação não é permitida: a função é insuficiente, não há acesso à coleção ou ao cartão, a requisição é executada no modo “View as” ou a organização está suspensa ou excluída (`detail` é um objeto com `code: org_suspended | org_deleted`).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
404O objeto não existe ou não está disponível para você. A API não confirma que um objeto restrito existe.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
422Erro de validação: o corpo ou os parâmetros não correspondem ao esquema (`detail` é uma lista de erros de validação), ou o valor de um parâmetro está fora do intervalo (`detail` é uma mensagem).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
429Requisições demais (`api.rate_limited`), a cota da organização para o minuto, o dia ou o mês se esgotou (`api.quota_exceeded`; `error.details` contém `quota`, `limit` e `reset_at`), o limite da organização foi atingido ou o serviço de respostas está ocupado (`answers.engine_busy`). Aguarde o tempo indicado no cabeçalho `Retry-After`.
Cabeçalhos da resposta
Retry-AfterNúmero de segundos a esperar antes de tentar a requisição novamente.
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
Códigos de erro
Códigos que este endpoint pode retornar em error.code, além dos códigos gerais de qualquer requisição.
- 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
Novas tentativas seguras
Envie um cabeçalho Idempotency-Key (por exemplo, um UUID) em cada POST e PATCH. Uma nova tentativa com a mesma chave em até 24 horas retorna a resposta salva, em vez de executar a requisição de novo.
Limites de taxa
As respostas trazem os cabeçalhos RateLimit e RateLimit-Policy e os anteriores X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Uma resposta 429 traz Retry-After em segundos: aguarde e tente de novo.