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).
Параметри в бисквитка
kb_view_asstringБисквитка на режима „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 прекъсването на връзката от клиента отменя отговора.
След първото събитие, докато отговорът е в ход, сървърът изпраща коментар : ping на всеки 15 секунди; пропускайте го. Ред на събитията: събития 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Не са изпратени идентификационни данни (нито бисквитка на сесията, нито 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 в секунди: изчакайте и опитайте отново.