POST/v1/chat
Отримувати відповідь асистента потоком (SSE)
chat
Якщо за балансувальником навантаження працює кілька копій API (адреса api.<domain>, 1.62.0), відповідь і буфер її подій зберігаються в пам’яті тієї копії, яка цю відповідь формує. Відновлення потоку з Last-Event-ID працює лише на цій копії.
Повторний запит із тим самим request_id і розмовою, що потрапляє на іншу копію після завершення відповіді, отримує збережену відповідь (token і done, події нумеруються з 1), а запитання повторно не ставиться. Повторний запит, що потрапляє на іншу копію, поки відповідь ще формується, зупиняє це формування й будує відповідь заново; друге запитання при цьому також не створюється. Щоб відновити потік без нового формування, тримайте з’єднання з тією самою копією або повторіть запит після події done.
Автентифікація
Передайте ключ API в заголовку Authorization: Authorization: Bearer <ключ>.
Параметри заголовка
X-View-AsstringЛише для ключів API з роллю
admin. Виконує запит від імені профілю доступу<profile>[:viewer|verifier|editor], наприкладemployee:viewer. Ключ інсталяції не може використовувати цей заголовок (403).
Параметри cookie
kb_view_asstringCookie режиму «View as» для сесії. Встановлюється через
POST /auth/view-as, очищається черезDELETE /auth/view-as.
Тіло запиту
application/json
items ≥ 1
collectionstringТипове значення: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanТипове значення: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanНе брати відповідь із кешу відповідей (кнопка «Get a fresh answer» під відповіддю з кешу). Свіжа відповідь замінює запис у кеші.
Типове значення: false
languagestring | nullМова відповіді: код ISO 639-1 (
de,en,ru, …), щоб відповісти цією мовою. Зautoабо без поля мова визначається за запитанням. Інтерфейс явно передає мову підказки іншою мовою (Starter.language).scopeChatScope | nullОбласть запитання: кілька колекцій, джерело, теги й період. Колекції області замінюють
collection. Джерело звужує відповідь до своєї колекції (і власних карток). Теги додаються доtags. Період обмежує фінансові відповіді цим періодом. Вибрати можна лише те, що бачить користувач (колекції:collections.no_access/collections.not_found; джерело:sources.not_found). Зconversation_idобласть зберігається в розмові. Без поля діє область розмови;nullабо порожня область очищає її.request_idstringКлюч ідемпотентності запитання. Надсилайте той самий ключ у кожному повторі потоку для одного запитання (повтор після розриву з’єднання; тут
Last-Event-IDне продовжує потік і лише записується в журнал). Повтор із ключем уже збереженої відповіді не створює другого запитання: збережений результат надсилається знову однією подієюdone(іtokenз текстом), навіть якщо ліміт запитань або кредитів вичерпано. Якщо попередня відповідь ще генерується для клієнта, що від’єднався, цю генерацію буде зупинено, а відповідь згенеровано заново.length ≤ 64
version_ofinteger (int64)Створює нову версію репліки цього запитання в розмові (
question_idзі стрічки розмови): змінене запитання (новий текст уmessages), повторно згенеровану відповідь (той самий текст, зазвичай зbypass_cache) або те саме запитання з іншимquality(наприклад,preciseпісля відповідіfast). Попередня пара запитання й відповіді зберігається. Репліки після неї лишаються в її гілці й приховані зі стрічки розмови, поки вибрано нову версію (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). Історія для відповіді — вибрана гілка до цієї репліки.qualityверсії не змінює налаштувань розмови. Потрібенconversation_id; запитання з іншої розмови повертає404 questions.not_found.qualitystringБаланс між швидкістю та точністю пошуку, на якому ґрунтується результат:
fast— швидше,precise— точніше. Типово —precise.Допустимі значення:
fastprecise
Відповіді
200З `stream=true`: `text/event-stream`. Кожна подія складається з рядків `id: <number>` (порядковий номер події в потоці, починаючи з 1) і `data: <JSON>`, після яких іде порожній рядок. Поля `event:` і `retry:` не використовуються; тип події — у полі `type` (`ChatEvent`).
З stream=true: text/event-stream. Кожна подія складається з рядків id: <number> (порядковий номер події в потоці, починаючи з 1) і data: <JSON>, після яких іде порожній рядок. Поля event: і retry: не використовуються; тип події — у полі type (ChatEvent).
Відповідь на запитання з request_id формується незалежно від з’єднання. Розрив з’єднання не зупиняє відповідь: її буде завершено й збережено в розмові (протягом щонайбільше 10 хвилин). Повтор того самого запиту (той самий request_id і розмова) приєднується до відповіді, що формується, а із заголовком Last-Event-ID отримує події після цього номера, тож потік продовжується з тими самими номерами подій. Якщо потік не може продовжитися з цього номера, повторний запит отримує потік від початку: тоді перша подія має номер, не більший за Last-Event-ID, і клієнт починає відповідь заново. Якщо відповідь уже завершено й буфер її подій звільнено (через 3 хвилини), збережений результат надсилається знову (token і done, нумерація з 1), а запитання повторно не ставиться; інакше відповідь формується заново. Щоб зупинити таку відповідь, викличте POST /v1/chat/cancel. Без request_id розрив з’єднання з боку клієнта скасовує відповідь.
Після першої події, поки відповідь формується, сервер кожні 15 секунд надсилає коментар : ping; пропускайте його. Порядок подій: події stage (перебіг), meta, sources, data, потім текст відповіді в подіях token, потім done. До тексту відповіді sources і data можуть повторюватися, а також можуть з’являтися події tool; текст може надійти одним token або частинами. Відповідь із кешу: meta (з cached), sources, data, token, done. Помилка після початку потоку надходить як подія error, і потік закривається без done; статус HTTP потоку завжди 200. Після done може надійти подія followups із підказками наступних запитань. Ігноруйте типи подій, які ви не обробляєте.
З stream=false: application/json з тілом AnswerResponse (а також conversation_id).
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
text/event-stream
application/json
answerstringобов’язковоquestion_idintegerобов’язковоquerystringcollectionstringобов’язковоprovenancearray of NumberProvenanceemptystringДопустимі значення:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullЧому для цієї відповіді використано інструменти:
request(явно запитано);compare,compute,action(за змістом запитання);needs_calc(потрібен розрахунок за таблицями);summary(огляд колекції або документів);mcp(організація підключила зовнішні сервери MCP).Допустимі значення:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringЛише для
POST /v1/chatз розмовою.answer_idstringID об’єкта відповіді.
400Неправильний запит: значення параметра або стан об’єкта не дозволяє виконати дію (`detail` — повідомлення).
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
401Облікові дані не надіслано (ні cookie сесії, ні ключа API) або ключ не знайдено.
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
403Дію не дозволено: роль не має достатніх прав, немає доступу до колекції чи картки, запит виконується в режимі «View as» або організацію призупинено чи видалено (`detail` — об’єкт із `code: org_suspended | org_deleted`).
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
404Об’єкт не існує або недоступний вам. API не підтверджує існування об’єкта з обмеженим доступом.
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
422Помилка валідації: тіло або параметри не відповідають схемі (`detail` — список помилок валідації) або значення параметра виходить за допустимі межі (`detail` — повідомлення).
Заголовки відповіді
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
429Забагато запитів (`api.rate_limited`), квоту організації на хвилину, день або місяць вичерпано (`api.quota_exceeded`; `error.details` містить `quota`, `limit` і `reset_at`), досягнуто ліміту організації або сервіс відповідей зайнятий (`answers.engine_busy`). Зачекайте стільки, скільки вказано в заголовку `Retry-After`.
Заголовки відповіді
Retry-AfterКількість секунд, які слід зачекати перед повторним запитом.
RateLimit-PolicyЧинні ліміти у форматі чернетки IETF
draft-ietf-httpapi-ratelimit-headers: елементи через кому"<name>";q=<quota>;w=<window in seconds>.key— частота запитів ключа API (квота — це сплеск, вікно — час, за який квота повністю відновлюється; для сесії цей елемент називаєтьсяuser, без облікових даних —ip);minute,dayіmonth— квоти організації на календарну хвилину, день і місяць за UTC.RateLimitСкільки лишилося за кожним лімітом із
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛіміт найсуворішого елемента в
RateLimit-Policy(того, за яким лишилося найменше запитів).X-RateLimit-RemainingСкільки запитів лишилося за найсуворішим лімітом.
X-RateLimit-ResetКількість секунд до скидання найсуворішого ліміту.
application/json
Коди помилок
Коди, які ця операція може повернути в error.code, крім загальних кодів будь-якого запиту.
- 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
Безпечні повтори
Надсилайте заголовок Idempotency-Key (наприклад, UUID) з кожним POST і PATCH. Повтор із тим самим ключем протягом 24 годин повертає збережену відповідь, а не виконує запит знову.
Ліміти частоти
Відповіді містять заголовки RateLimit і RateLimit-Policy, а також давніші X-RateLimit-Limit, X-RateLimit-Remaining і X-RateLimit-Reset. Відповідь 429 містить Retry-After у секундах: зачекайте й повторіть запит.