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 режима «Смотреть как» для сессии.
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Не брать ответ из кеша ответов (кнопка «Получить свежий ответ» под ответом из кеша). Свежий ответ заменяет запись в кеше.
По умолчанию: 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Действие запрещено: недостаточно прав роли, нет доступа к коллекции или карточке, запрос выполняется в режиме «Смотреть как» либо организация приостановлена или удалена (`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 в секундах: подождите и повторите запрос.