POST/v1/chat
Trasmettere in streaming una risposta dell’assistente (SSE)
chat
Con più copie dell’API dietro un bilanciatore di carico (l’indirizzo api.<domain>, 1.62.0), una risposta e il buffer dei suoi eventi si trovano nella memoria della copia che la genera. La ripresa dello stream con Last-Event-ID funziona solo su quella copia.
Una richiesta ripetuta con lo stesso request_id e la stessa conversazione che raggiunge un’altra copia dopo che la risposta è terminata riceve la risposta salvata (token e done, eventi numerati da 1) senza porre di nuovo la domanda. Una richiesta ripetuta che raggiunge un’altra copia mentre la risposta è ancora in fase di generazione interrompe quella generazione e costruisce la risposta da capo; anche in questo caso non viene creata una seconda domanda. Per riprendere lo stream senza una nuova generazione, mantieni la connessione con la stessa copia o ripeti la richiesta dopo l’evento done.
Autenticazione
Invia una chiave API nell’intestazione Authorization: Authorization: Bearer <chiave>.
Parametri di intestazione
X-View-AsstringSolo per le chiavi API con il ruolo
admin. Esegue la richiesta come il profilo dati<profile>[:viewer|verifier|editor], ad esempioemployee:viewer. La chiave di installazione non può usare questa intestazione (403).
Parametri cookie
kb_view_asstringCookie della modalità “View as” per una sessione.
POST /auth/view-aslo imposta eDELETE /auth/view-aslo cancella.
Corpo della richiesta
application/json
items ≥ 1
collectionstringPredefinito: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanPredefinito: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNon prendere la risposta dalla cache delle risposte (il pulsante “Get a fresh answer”, ottenere una risposta nuova, sotto una risposta dalla cache). La nuova risposta sostituisce la voce nella cache.
Predefinito: false
languagestring | nullLingua della risposta: un codice ISO 639-1 (
de,en,ru, …) per rispondere in quella lingua. Conautoo senza il campo, la lingua viene rilevata dalla domanda. L’interfaccia passa esplicitamente la lingua di un suggerimento in un’altra lingua (Starter.language).scopeChatScope | nullPerimetro della domanda: più raccolte, una fonte, tag e un periodo. Le raccolte del perimetro sostituiscono
collection. Una fonte restringe la risposta alla sua raccolta (e alle sue schede). I tag si aggiungono atags. Il periodo limita le risposte finanziarie a quel periodo. Puoi selezionare solo ciò che l’utente può vedere (raccolte:collections.no_access/collections.not_found; fonte:sources.not_found). Conconversation_id, il perimetro viene salvato nella conversazione. Senza il campo si applica il perimetro della conversazione;nullo un perimetro vuoto lo azzera.request_idstringChiave di idempotenza della domanda. Invia la stessa chiave in ogni nuovo tentativo dello stream per una stessa domanda (un nuovo tentativo dopo una disconnessione; qui
Last-Event-IDnon riprende lo stream e viene solo registrato). Un nuovo tentativo con la chiave di una risposta già salvata non crea una seconda domanda: il risultato salvato viene inviato di nuovo come un unico eventodone(e untokencon il testo), anche se il limite di domande o di crediti è esaurito. Se la risposta precedente è ancora in fase di generazione per un client disconnesso, quella generazione si interrompe e la risposta viene generata di nuovo.length ≤ 64
version_ofinteger (int64)Crea una nuova versione del turno di questa domanda nella conversazione (
question_iddal feed): una domanda modificata (nuovo testo inmessages), una risposta rigenerata (lo stesso testo, di solito conbypass_cache) o la stessa domanda con un altro valore diquality(per esempioprecisedopo una rispostafast). La coppia precedente di domanda e risposta viene conservata. I turni successivi restano nel suo ramo e sono nascosti dal feed mentre è selezionata la nuova versione (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). La cronologia usata per la risposta è il ramo selezionato fino a questo turno. Il valorequalitydi una versione non cambia le impostazioni della conversazione. Richiedeconversation_id; una domanda di un’altra conversazione restituisce404 questions.not_found.qualitystringEquilibrio tra velocità e accuratezza della ricerca alla base del risultato:
fastè più rapida,preciseè più accurata. Predefinito:precise.Valori ammessi:
fastprecise
Risposte
200Con `stream=true`: `text/event-stream`. Ogni evento è composto dalle righe `id: <number>` (il numero progressivo dell’evento nello stream, a partire da 1) e `data: <JSON>`, seguite da una riga vuota. I campi `event:` e `retry:` non vengono usati; il tipo di evento è nel campo `type` (`ChatEvent`).
Con stream=true: text/event-stream. Ogni evento è composto dalle righe id: <number> (il numero progressivo dell’evento nello stream, a partire da 1) e data: <JSON>, seguite da una riga vuota. I campi event: e retry: non vengono usati; il tipo di evento è nel campo type (ChatEvent).
A una domanda con request_id viene data risposta indipendentemente dalla connessione. Una disconnessione non interrompe la risposta: viene completata e salvata nella conversazione (per un massimo di 10 minuti). Ripetendo la stessa richiesta (lo stesso request_id e la stessa conversazione) ci si collega alla risposta in corso e, con l’intestazione Last-Event-ID, si ricevono gli eventi successivi a quel numero, quindi lo stream continua con la stessa numerazione degli eventi. Se lo stream non può continuare da quel numero, la richiesta ripetuta riceve lo stream dall’inizio: il primo evento ha allora un numero non superiore a Last-Event-ID e il client ricomincia la risposta. Se la risposta è già terminata e il buffer dei suoi eventi è stato rilasciato (dopo 3 minuti), il risultato salvato viene inviato di nuovo (token e done, numerati da 1) senza porre di nuovo la domanda; altrimenti la risposta viene generata da capo. Per interrompere una risposta di questo tipo, chiama POST /v1/chat/cancel. Senza request_id, la disconnessione del client annulla la risposta.
Dopo il primo evento, mentre la risposta è in corso, il server invia un commento : ping ogni 15 secondi; ignoralo. Ordine degli eventi: eventi stage (avanzamento), meta, sources, data, poi il testo della risposta in eventi token, poi done. Prima del testo della risposta, sources e data possono ripetersi e possono comparire eventi tool; il testo può arrivare come un unico token o in parti. Una risposta dalla cache: meta (con cached), sources, data, token, done. Un errore dopo l’inizio dello stream arriva come evento error e lo stream si chiude senza done; lo stato HTTP dello stream è sempre 200. Dopo done può arrivare un evento followups con le domande successive suggerite. Ignora i tipi di evento che non gestisci.
Con stream=false: application/json con un corpo AnswerResponse (più conversation_id).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
text/event-stream
application/json
answerstringobbligatorioquestion_idintegerobbligatorioquerystringcollectionstringobbligatorioprovenancearray of NumberProvenanceemptystringValori ammessi:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullPerché sono stati usati strumenti per questa risposta:
request(richiesti esplicitamente);compare,compute,action(in base alla domanda);needs_calc(serve un calcolo sulle tabelle);summary(una panoramica di una raccolta o di documenti);mcp(l’organizzazione ha collegato server MCP esterni).Valori ammessi:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringSolo per
POST /v1/chatcon una conversazione.answer_idstringID dell’oggetto della risposta.
400La richiesta non è valida: il valore di un parametro o lo stato dell’oggetto non consente l’azione (`detail` è un messaggio).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
401Non sono state inviate credenziali (né un cookie di sessione né una chiave API), oppure la chiave non è stata trovata.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
403L’azione non è consentita: il ruolo non è sufficiente, manca l’accesso alla raccolta o alla scheda, la richiesta viene eseguita in modalità “View as”, oppure l’organizzazione è sospesa o eliminata (`detail` è un oggetto con `code: org_suspended | org_deleted`).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
404L’oggetto non esiste o non è disponibile per te. L’API non conferma l’esistenza di un oggetto con accesso limitato.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
422Errore di validazione: il corpo o i parametri non corrispondono allo schema (`detail` è un elenco di errori di validazione), oppure il valore di un parametro è fuori dall’intervallo ammesso (`detail` è un messaggio).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
429Troppe richieste (`api.rate_limited`), la quota dell’organizzazione per il minuto, il giorno o il mese è esaurita (`api.quota_exceeded`; `error.details` contiene `quota`, `limit` e `reset_at`), è stato raggiunto il limite dell’organizzazione, oppure il servizio delle risposte è occupato (`answers.engine_busy`). Attendi il tempo indicato nell’intestazione `Retry-After`.
Intestazioni della risposta
Retry-AfterNumero di secondi da attendere prima di ripetere la richiesta.
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
Codici di errore
Codici che questo endpoint può restituire in error.code, oltre ai codici generali di ogni richiesta.
- 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
Nuovi tentativi sicuri
Invia un’intestazione Idempotency-Key (per esempio un UUID) con ogni POST e PATCH. Un nuovo tentativo con la stessa chiave entro 24 ore restituisce la risposta salvata invece di eseguire di nuovo la richiesta.
Limiti di frequenza
Le risposte contengono le intestazioni RateLimit e RateLimit-Policy e le precedenti X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Una risposta 429 contiene Retry-After in secondi: attendi e riprova.