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 прекид везе клијента отказује одговор.
После првог догађаја, док је одговор у току, сервер на сваких 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Акредитиви нису послати (ни колачић сесије ни 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
Безбедни поновни покушаји
Уз сваки POST и PATCH захтев пошаљите заглавље Idempotency-Key (на пример UUID). Поновни покушај са истим кључем у року од 24 сата враћа сачувани одговор уместо да поново изврши захтев.
Ограничења учесталости
Одговори садрже заглавља RateLimit и RateLimit-Policy, као и старија X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset. Одговор 429 садржи заглавље Retry-After у секундама: сачекајте и поновите захтев.