POST/v1/chat
Stream et svar fra assistenten (SSE)
chat
Med flere kopier af API’et bag en load balancer (adressen api.<domain>, 1.62.0) ligger et svar og bufferen med dets hændelser i hukommelsen hos den kopi, der genererer det. Genoptagelse af streamen med Last-Event-ID virker kun på den kopi.
En gentaget anmodning med samme request_id og samtale, der når en anden kopi, efter at svaret er færdigt, modtager det gemte svar (token og done, hændelser nummereret fra 1) uden at stille spørgsmålet igen. En gentaget anmodning, der når en anden kopi, mens svaret stadig genereres, stopper den generering og bygger svaret på ny; der oprettes heller ikke et ekstra spørgsmål. For at genoptage streamen uden en ny generering skal du holde forbindelsen til den samme kopi eller gentage anmodningen efter hændelsen done.
Autentificering
Send en API-nøgle i headeren Authorization: Authorization: Bearer <nøgle>.
Headerparametre
X-View-AsstringKun for API-nøgler med rollen
admin. Udfører anmodningen som dataprofilen<profile>[:viewer|verifier|editor], fxemployee:viewer. Installationsnøglen kan ikke bruge denne header (403).
Cookieparametre
kb_view_asstringCookie for tilstanden »View as« i en session.
POST /auth/view-assætter den, ogDELETE /auth/view-asfjerner den.
Anmodningens brødtekst
application/json
items ≥ 1
collectionstringStandard: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanStandard: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanHent ikke svaret fra svarcachen (knappen »Get a fresh answer« under et cachet svar). Det nye svar erstatter posten i cachen.
Standard: false
languagestring | nullSvarets sprog: en kode efter ISO 639-1 (
de,en,ru, …) for at få svar på det sprog. Medautoeller uden feltet registreres sproget ud fra spørgsmålet. Brugerfladen angiver eksplicit sproget for et forslag på et andet sprog (Starter.language).scopeChatScope | nullSpørgsmålets afgrænsning: flere samlinger, en kilde, tags og en periode. Afgrænsningens samlinger erstatter
collection. En kilde indsnævrer svaret til kildens samling (og kildens egne kort). Tags føjes tiltags. Perioden begrænser økonomiske svar til den periode. Du kan kun vælge det, brugeren kan se (samlinger:collections.no_access/collections.not_found; kilde:sources.not_found). Medconversation_idgemmes afgrænsningen i samtalen. Uden feltet gælder samtalens afgrænsning;nulleller en tom afgrænsning rydder den.request_idstringSpørgsmålets idempotensnøgle. Send den samme nøgle i hvert nyt forsøg på streamen for ét spørgsmål (et nyt forsøg efter en afbrudt forbindelse; her fortsætter
Last-Event-IDikke streamen og logges kun). Et nyt forsøg med nøglen for et svar, der allerede er gemt, opretter ikke et nyt spørgsmål: det gemte resultat sendes igen som én hændelsedone(og en hændelsetokenmed teksten), også selvom grænsen for spørgsmål eller credits er opbrugt. Genereres det forrige svar stadig for en klient, der har mistet forbindelsen, stopper genereringen, og svaret genereres på ny.length ≤ 64
version_ofinteger (int64)Opretter en ny version af dette spørgsmåls runde i samtalen (
question_idfra feedet): et redigeret spørgsmål (ny tekst imessages), et nygenereret svar (den samme tekst, som regel medbypass_cache) eller det samme spørgsmål med en andenquality(fxpreciseefter etfast-svar). Det forrige par af spørgsmål og svar bevares. Runderne efter det bliver i dets gren og skjules i feedet, mens den nye version er valgt (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). Historikken, der bruges til svaret, er den valgte gren frem til denne runde. En versionsqualityændrer ikke samtalens indstillinger. Kræverconversation_id; et spørgsmål fra en anden samtale returnerer404 questions.not_found.qualitystringBalancen mellem hastighed og nøjagtighed i søgningen bag resultatet:
faster hurtigere,preciseer mere nøjagtig. Standard:precise.Tilladte værdier:
fastprecise
Svar
200Med `stream=true`: `text/event-stream`. Hver hændelse består af linjerne `id: <number>` (hændelsens løbenummer i streamen, startende ved 1) og `data: <JSON>` efterfulgt af en tom linje. Felterne `event:` og `retry:` bruges ikke; hændelsestypen står i feltet `type` (`ChatEvent`).
Med stream=true: text/event-stream. Hver hændelse består af linjerne id: <number> (hændelsens løbenummer i streamen, startende ved 1) og data: <JSON> efterfulgt af en tom linje. Felterne event: og retry: bruges ikke; hændelsestypen står i feltet type (ChatEvent).
Et spørgsmål med request_id besvares uafhængigt af forbindelsen. En afbrudt forbindelse stopper ikke svaret: det gøres færdigt og gemmes i samtalen (i op til 10 minutter). Gentages den samme anmodning (samme request_id og samtale), kobles den på svaret, der er i gang, og med headeren Last-Event-ID modtager den hændelserne efter det nummer, så streamen fortsætter med de samme hændelsesnumre. Kan streamen ikke fortsætte fra det nummer, får den gentagne anmodning streamen fra starten: den første hændelse har så et nummer, der ikke er større end Last-Event-ID, og klienten starter svaret forfra. Er svaret allerede færdigt, og er dets hændelsesbuffer frigivet (efter 3 minutter), sendes det gemte resultat igen (token og done, nummereret fra 1) uden at stille spørgsmålet igen; ellers genereres svaret på ny. Kald POST /v1/chat/cancel for at stoppe et sådant svar. Uden request_id annullerer en afbrudt forbindelse fra klienten svaret.
Efter den første hændelse og så længe svaret er i gang, sender serveren en kommentar : ping hvert 15. sekund; spring den over. Rækkefølgen af hændelser: hændelser stage (fremdrift), meta, sources, data, derefter svarets tekst i hændelser token og til sidst done. Før svarets tekst kan sources og data gentages, og hændelser tool kan forekomme; teksten kan komme som ét token eller i dele. Et svar fra cachen: meta (med cached), sources, data, token, done. En fejl, efter at streamen er startet, kommer som en hændelse error, og streamen lukkes uden done; streamens HTTP-status er altid 200. Efter done kan der komme en hændelse followups med forslag til næste spørgsmål. Ignorér hændelsestyper, du ikke håndterer.
Med stream=false: application/json med en brødtekst AnswerResponse (plus conversation_id).
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
text/event-stream
application/json
answerstringpåkrævetquestion_idintegerpåkrævetquerystringcollectionstringpåkrævetprovenancearray of NumberProvenanceemptystringTilladte værdier:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullHvorfor der blev brugt værktøjer til dette svar:
request(eksplicit ønsket);compare,compute,action(ud fra spørgsmålet);needs_calc(der kræves en beregning på tabeller);summary(en oversigt over en samling eller dokumenter);mcp(organisationen har tilsluttet eksterne MCP-servere).Tilladte værdier:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringKun for
POST /v1/chatmed en samtale.answer_idstringSvarobjektets id.
400Anmodningen er ugyldig: en parameterværdi eller objektets tilstand tillader ikke handlingen (`detail` er en meddelelse).
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
401Der blev ikke sendt legitimationsoplysninger (hverken en sessionscookie eller en API-nøgle), eller nøglen blev ikke fundet.
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
403Handlingen er ikke tilladt: rollen er utilstrækkelig, der er ingen adgang til samlingen eller kortet, anmodningen kører i tilstanden »View as«, eller organisationen er suspenderet eller slettet (`detail` er et objekt med `code: org_suspended | org_deleted`).
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
404Objektet findes ikke eller er ikke tilgængeligt for dig. API’et bekræfter ikke, at et begrænset objekt findes.
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
422Valideringsfejl: brødteksten eller parametrene svarer ikke til skemaet (`detail` er en liste over valideringsfejl), eller en parameterværdi ligger uden for det tilladte interval (`detail` er en meddelelse).
Svarets headere
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
429For mange anmodninger (`api.rate_limited`), organisationens kvote for minuttet, dagen eller måneden er brugt op (`api.quota_exceeded`; `error.details` indeholder `quota`, `limit` og `reset_at`), organisationens grænse er nået, eller svartjenesten er optaget (`answers.engine_busy`). Vent den tid, der står i headeren `Retry-After`.
Svarets headere
Retry-AfterAntal sekunder, du skal vente, før du prøver anmodningen igen.
RateLimit-PolicyGældende grænser i formatet fra IETF-udkastet
draft-ietf-httpapi-ratelimit-headers: kommaseparerede elementer"<name>";q=<quota>;w=<window in seconds>.keyer API-nøglens anmodningshastighed (kvoten er burst, vinduet er tiden til fuld genopfyldning; for en session er detuser, uden legitimationsoplysningerip);minute,dayogmonther organisationens kvoter for kalenderminuttet, kalenderdagen og kalendermåneden i UTC.RateLimitHvad der er tilbage af hver grænse i
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGrænsen for den strengeste post i
RateLimit-Policy(den med færrest resterende anmodninger).X-RateLimit-RemainingResterende anmodninger under den strengeste grænse.
X-RateLimit-ResetSekunder, til den strengeste grænse nulstilles.
application/json
Fejlkoder
Koder, som denne operation kan returnere i error.code, ud over de generelle koder for alle anmodninger.
- 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
Sikre nye forsøg
Send en Idempotency-Key-header (fx et UUID) med hver POST og PATCH. Et nyt forsøg med den samme nøgle inden for 24 timer returnerer det gemte svar i stedet for at køre anmodningen igen.
Hastighedsgrænser
Svarene har headerne RateLimit og RateLimit-Policy samt de tidligere X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset. Et 429-svar har Retry-After i sekunder: Vent, og forsøg igen.