POST/v1/chat
Strumieniowanie odpowiedzi asystenta (SSE)
chat
Przy kilku kopiach API za modułem równoważenia obciążenia (adres api.<domain>, 1.62.0) odpowiedź i bufor jej zdarzeń znajdują się w pamięci kopii, która ją generuje. Wznowienie strumienia z Last-Event-ID działa tylko na tej kopii.
Powtórzone żądanie z tym samym request_id i tą samą rozmową, które trafi do innej kopii po zakończeniu odpowiedzi, otrzymuje zapisaną odpowiedź (token i done, zdarzenia numerowane od 1) bez ponownego zadawania pytania. Powtórzone żądanie, które trafi do innej kopii, gdy odpowiedź jest jeszcze generowana, zatrzymuje to generowanie i buduje odpowiedź od nowa; drugie pytanie również nie powstaje. Aby wznowić strumień bez nowego generowania, utrzymuj połączenie z tą samą kopią lub powtórz żądanie po zdarzeniu done.
Uwierzytelnianie
Wyślij klucz API w nagłówku Authorization: Authorization: Bearer <klucz>.
Parametry nagłówka
X-View-AsstringTylko dla kluczy API z rolą
admin. Wykonuje żądanie jako profil dostępu<profile>[:viewer|verifier|editor], np.employee:viewer. Klucz instalacji nie może używać tego nagłówka (403).
Parametry cookie
kb_view_asstringPlik cookie trybu „View as” dla sesji.
POST /auth/view-asgo ustawia, aDELETE /auth/view-asusuwa.
Treść żądania
application/json
items ≥ 1
collectionstringDomyślnie: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanDomyślnie: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanNie pobiera odpowiedzi z pamięci podręcznej odpowiedzi (przycisk „Get a fresh answer” pod odpowiedzią z pamięci podręcznej). Nowa odpowiedź zastępuje wpis w pamięci podręcznej.
Domyślnie: false
languagestring | nullJęzyk odpowiedzi: kod ISO 639-1 (
de,en,ru, …), aby odpowiedź była w tym języku. Przyautolub bez pola język jest wykrywany na podstawie pytania. Interfejs jawnie przekazuje język podpowiedzi w innym języku (Starter.language).scopeChatScope | nullZakres pytania: kilka kolekcji, źródło, tagi i okres. Kolekcje zakresu zastępują
collection. Źródło zawęża odpowiedź do swojej kolekcji (i swoich kart). Tagi są dodawane dotags. Okres ogranicza odpowiedzi finansowe do tego okresu. Można wybrać tylko to, co widzi użytkownik (kolekcje:collections.no_access/collections.not_found; źródło:sources.not_found). Zconversation_idzakres jest zapisywany w rozmowie. Bez pola obowiązuje zakres rozmowy;nulllub pusty zakres go czyści.request_idstringKlucz idempotencji pytania. Wysyłaj ten sam klucz w każdym ponowieniu strumienia dla jednego pytania (ponowienie po rozłączeniu; tutaj
Last-Event-IDnie kontynuuje strumienia i jest tylko zapisywany w dzienniku). Ponowienie z kluczem odpowiedzi, która jest już zapisana, nie tworzy drugiego pytania: zapisany wynik zostaje wysłany ponownie jako jedno zdarzeniedone(itokenz tekstem), nawet jeśli limit pytań lub kredytów jest wyczerpany. Jeśli poprzednia odpowiedź jest nadal generowana dla rozłączonego klienta, to generowanie się zatrzymuje, a odpowiedź jest generowana od nowa.length ≤ 64
version_ofinteger (int64)Tworzy nową wersję tury tego pytania w rozmowie (
question_idz przebiegu rozmowy): zmienione pytanie (nowy tekst wmessages), ponownie wygenerowaną odpowiedź (ten sam tekst, zwykle zbypass_cache) lub to samo pytanie z innymquality(np.precisepo odpowiedzifast). Poprzednia para pytania i odpowiedzi zostaje zachowana. Tury po niej pozostają w jej gałęzi i są ukryte w przebiegu rozmowy, dopóki wybrana jest nowa wersja (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). Historia używana do odpowiedzi to wybrana gałąź aż do tej tury.qualitywersji nie zmienia ustawień rozmowy. Wymagaconversation_id; pytanie z innej rozmowy zwraca404 questions.not_found.qualitystringRównowaga między szybkością a dokładnością wyszukiwania stojącego za wynikiem:
fastjest szybszy,precise– dokładniejszy. Domyślnie:precise.Dozwolone wartości:
fastprecise
Odpowiedzi
200Z `stream=true`: `text/event-stream`. Każde zdarzenie składa się z wierszy `id: <number>` (numer kolejny zdarzenia w strumieniu, od 1) i `data: <JSON>`, po których następuje pusty wiersz. Pola `event:` i `retry:` nie są używane; typ zdarzenia jest w polu `type` (`ChatEvent`).
Z stream=true: text/event-stream. Każde zdarzenie składa się z wierszy id: <number> (numer kolejny zdarzenia w strumieniu, od 1) i data: <JSON>, po których następuje pusty wiersz. Pola event: i retry: nie są używane; typ zdarzenia jest w polu type (ChatEvent).
Odpowiedź na pytanie z request_id powstaje niezależnie od połączenia. Rozłączenie nie zatrzymuje odpowiedzi: zostaje ona dokończona i zapisana w rozmowie (do 10 minut). Powtórzenie tego samego żądania (ten sam request_id i ta sama rozmowa) dołącza do trwającej odpowiedzi, a z nagłówkiem Last-Event-ID otrzymuje zdarzenia po tym numerze, więc strumień jest kontynuowany z tymi samymi numerami zdarzeń. Jeśli strumienia nie da się kontynuować od tego numeru, powtórzone żądanie otrzymuje strumień od początku: pierwsze zdarzenie ma wtedy numer nie większy niż Last-Event-ID, a klient zaczyna odpowiedź od nowa. Jeśli odpowiedź już się zakończyła, a bufor jej zdarzeń został zwolniony (po 3 minutach), zapisany wynik jest wysyłany ponownie (token i done, numerowane od 1) bez ponownego zadawania pytania; w przeciwnym razie odpowiedź jest generowana od nowa. Aby zatrzymać taką odpowiedź, wywołaj POST /v1/chat/cancel. Bez request_id rozłączenie klienta anuluje odpowiedź.
Po pierwszym zdarzeniu, dopóki odpowiedź trwa, serwer co 15 sekund wysyła komentarz : ping; pomiń go. Kolejność zdarzeń: zdarzenia stage (postęp), meta, sources, data, następnie tekst odpowiedzi w zdarzeniach token, a potem done. Przed tekstem odpowiedzi sources i data mogą się powtarzać i mogą pojawić się zdarzenia tool; tekst może przyjść jako jeden token lub w częściach. Odpowiedź z pamięci podręcznej: meta (z cached), sources, data, token, done. Błąd po rozpoczęciu strumienia przychodzi jako zdarzenie error, a strumień zamyka się bez done; status HTTP strumienia to zawsze 200. Po done może przyjść zdarzenie followups z propozycjami kolejnych pytań. Ignoruj typy zdarzeń, których nie obsługujesz.
Z stream=false: application/json z treścią AnswerResponse (oraz conversation_id).
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
text/event-stream
application/json
answerstringwymaganequestion_idintegerwymaganequerystringcollectionstringwymaganeprovenancearray of NumberProvenanceemptystringDozwolone wartości:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullDlaczego przy tej odpowiedzi użyto narzędzi:
request(wprost o to poproszono);compare,compute,action(na podstawie pytania);needs_calc(potrzebne są obliczenia na tabelach);summary(przegląd kolekcji lub dokumentów);mcp(organizacja podłączyła zewnętrzne serwery MCP).Dozwolone wartości:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringTylko dla
POST /v1/chatz rozmową.answer_idstringID obiektu odpowiedzi.
400Żądanie jest nieprawidłowe: wartość parametru lub stan obiektu nie pozwala na to działanie (`detail` zawiera komunikat).
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
401Nie przesłano danych uwierzytelniających (ani pliku cookie sesji, ani klucza API) lub nie znaleziono klucza.
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
403Działanie jest niedozwolone: rola jest niewystarczająca, brak dostępu do kolekcji lub karty, żądanie jest wykonywane w trybie „View as” albo organizacja jest zawieszona lub usunięta (`detail` to obiekt z `code: org_suspended | org_deleted`).
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
404Obiekt nie istnieje lub nie jest dla Ciebie dostępny. API nie potwierdza istnienia obiektu z ograniczonym dostępem.
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
422Błąd walidacji: treść lub parametry nie odpowiadają schematowi (`detail` to lista błędów walidacji) albo wartość parametru jest poza zakresem (`detail` zawiera komunikat).
Nagłówki odpowiedzi
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
429Zbyt wiele żądań (`api.rate_limited`), wyczerpano przydział organizacji na minutę, dzień lub miesiąc (`api.quota_exceeded`; `error.details` zawiera `quota`, `limit` i `reset_at`), osiągnięto limit organizacji albo usługa odpowiedzi jest zajęta (`answers.engine_busy`). Odczekaj czas podany w nagłówku `Retry-After`.
Nagłówki odpowiedzi
Retry-AfterLiczba sekund oczekiwania przed ponowieniem żądania.
RateLimit-PolicyObowiązujące limity w formacie projektu IETF
draft-ietf-httpapi-ratelimit-headers: elementy rozdzielone przecinkami"<name>";q=<quota>;w=<window in seconds>.keyto częstotliwość żądań klucza API (przydział to wielkość chwilowego szczytu (burst), okno to czas jego pełnego odnowienia; dla sesji jest touser, bez danych uwierzytelniającychip);minute,dayimonthto przydziały organizacji na minutę, dzień i miesiąc kalendarzowy w UTC.RateLimitCo pozostało z każdego limitu w
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimit najbardziej restrykcyjnej pozycji w
RateLimit-Policy(tej, w której zostało najmniej żądań).X-RateLimit-RemainingLiczba żądań pozostałych w ramach najbardziej restrykcyjnego limitu.
X-RateLimit-ResetLiczba sekund do odnowienia najbardziej restrykcyjnego limitu.
application/json
Kody błędów
Kody, które ta operacja może zwrócić w error.code, oprócz ogólnych kodów każdego żądania.
- 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
Bezpieczne ponawianie
Wysyłaj nagłówek Idempotency-Key (na przykład UUID) z każdym żądaniem POST i PATCH. Ponowienie z tym samym kluczem w ciągu 24 godzin zwraca zapisaną odpowiedź, zamiast ponownie wykonywać żądanie.
Limity częstotliwości
Odpowiedzi zawierają nagłówki RateLimit i RateLimit-Policy oraz starsze X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset. Odpowiedź 429 ma nagłówek Retry-After w sekundach: odczekaj i ponów żądanie.