Smart Answer: AI-antwoord in uw websitezoekfunctie
Smart Answer insluiten: suche.js, het blok in de markup, de openbare HTTP-interface voor door de server gerenderde zoekpagina’s, de SSE-antwoordstream, CSS-variabelen en overdracht naar de chat.
Smart Answer toont boven of onder de resultaten van uw websitezoekfunctie een kort antwoord op de vraag van de bezoeker — gestreamd, met bronnen uit uw kennisbank en een veld voor de volgende vraag. Smart Answer is een afzonderlijke dienst; deze gebruikt dezelfde kennisbank als uw chatassistent. Inschakelen en vormgeven doet u in uw account onder Project → Smart Answer voor zoeken op de website.
Insluiten met suche.js
Als de chatloader al op de pagina staat, volstaat één regel:
<script src="https://cdn.reactive.chat/suche.js" async></script>
Zonder de chatwidget geeft u de sitesleutel mee:
<script src="https://cdn.reactive.chat/suche.js" data-site-key="SITE_KEY" async></script>
Het script koppelt zich aan de zoekvelden van uw pagina (welke dat zijn, bepaalt u in uw account met een CSS-selector), wacht op verzenden of een typpauze en toont het antwoord in een blok op de ingestelde plek (vóór, na of binnen een doelelement). Standaard beantwoordt het alleen invoer die op een vraag lijkt.
Attributen op de scripttag:
- data-site-key (optioneel) — anders overgenomen van de chatloader (
data-rc-site-key). - data-ws-url (optioneel) — chatadres; anders afgeleid zoals voor de chat.
- data-api (optioneel) — basisadres van de interface, standaard
https://ws.reactive.chatof uw eigen domein. - data-locale (optioneel) — taal; anders
<html lang>, daarna de browser.
Het script plaatst geen cookies en slaat alleen gegevens in sessionStorage op. Voor de CSP heeft het script-src https://cdn.reactive.chat en connect-src https://ws.reactive.chat nodig (Beveiliging en CSP).
Overdracht naar de chat
Als de bezoeker een vervolgvraag in het blok stelt, gaat het gesprek — afhankelijk van de instelling Vervolgvraag — verder in de chatwidget (ReactiveChat('continueConversation', id, text) of ReactiveChat('startConversation', text)) of wordt de vraag in hetzelfde blok beantwoord. Zonder chatwidget op de pagina blijft de vervolgvraag altijd in het blok.
Vormgeving
Het blok (.rc-ai) heeft eigen CSS en is beschermd tegen resets van uw pagina. U kunt het via variabelen met de laagste specificiteit aanpassen:
.rc-ai {
--rc-ai-akzent: #0a7cff;
--rc-ai-hg: var(--karte, #fff);
--rc-ai-text: #1d1d1f;
--rc-ai-rand: #e3e3e8;
--rc-ai-radius: 10px;
--rc-ai-schrift: inherit;
--rc-ai-abstand: 20px;
--rc-ai-schriftgroesse: 16px;
--rc-ai-zeilenhoehe: 1.6;
}
Afzonderlijke onderdelen wijzigt u met .rc-ai .rc-ai__teil { … } in het veld Eigen CSS in uw account, bijvoorbeeld .rc-ai .rc-ai__hinweis { display: none; }. De beschermlaag beschermt niet tegen regels van uw pagina met #id of !important.
HTTP-interface
Voor door de server gerenderde zoekpagina’s of eigen interfaces is er een openbare interface zonder authenticatie en zonder cookies op https://ws.reactive.chat/api/suche/SITE_KEY.
Gemeenschappelijk voor alle endpoints:
- CORS alleen voor origins uit de domeinen van uw project (inclusief subdomeinen); aanroepen vanaf uw server zonder
Originwerken altijd. - Begrenzing: 60 verzoeken per minuut en bezoekersadres over alle endpoints samen → 429 met
Retry-AfterenX-RateLimit-*. Bij aanroepen vanaf uw server telt het adres van uw server — gebruik voor veel bezoekers daaromsuche.jsin de browser of het eigen domein met een proxysleutel. - Vragen en antwoorden worden niet in toegangslogboeken geschreven.
GET /api/suche/SITE_KEY?locale=de — configuratie, CSS en leeg sjabloon van het blok (Cache-Control: public, max-age=60):
{"v":1,"aktiv":false}— uit, geblokkeerd of onbekend (404 bij een onbekende sleutel).{"v":1,"aktiv":true,"sprache":"de","konfig":{…},"css":"…","vorlage":"<div class=\"rc-ai\" …>","skript":"https://cdn.reactive.chat/suche.js"}
POST /api/suche/SITE_KEY — kant-en-klare HTML van het blok voor een vraag, body maximaal 4 KB:
curl -s -X POST "https://ws.reactive.chat/api/suche/SITE_KEY" \
-H "Content-Type: application/json" \
-d '{"q":"How long does shipping take?","locale":"en"}'
{"v":1,"aktiv":true,"frage":false,"html":""}— de invoer is geen vraag.{"v":1,"aktiv":true,"frage":true,"html":"…","css":"<style id=\"rc-ai-css\">…</style>","skript":"…","einbettung":"…"}— voegeinbettungin uw zoekpagina in;suche.jsvult het blok dan met het antwoord.- 400
{"v":1,"error":"bad_request","field":"q"}—qontbreekt, is leeg of langer dan 300 tekens. - 413
payload_too_large, 405 voor elke andere methode.
POST /api/suche/SITE_KEY/antwort — het antwoord zelf als Server-Sent Events-stream, body maximaal 8 KB:
{"q":"How long does shipping take?","locale":"en",
"visitor_id":"v_…",
"ctx":{"url":"https://shop.example/search","title":"Search"},
"folge":false,
"vorher":[{"q":"…","a":"…"}]}
- q (string, verplicht, 1–300 tekens)
- locale (string, optioneel)
- visitor_id (string, optioneel,
[A-Za-z0-9_-]{1,80}) — de ID van de chatbezoeker, zodat de overdracht naar de chat aansluit. - ctx (object, optioneel) —
url,path,referrer,title; query en anker worden verwijderd. - folge (
true, optioneel) — vervolgvraag; omzeilt het vraagfilter. - vorher (lijst, optioneel) — maximaal 3 eerdere paren (
q≤ 300,a≤ 1500 tekens).
Antwoord text/event-stream:
event: status
data: {"stufe":"denkt"}
event: text
data: {"text":"Shipping usually takes"}
event: fertig
data: {"text":"Shipping usually takes 2–3 working days.","quellen":[{"titel":"Shipping","url":"https://shop.example/shipping"}],"fortsetzung":{"art":"faden","id":"01J…"}}
- status —
{stufe}:denkt,sucht,schreibt,wartet. De eerste gebeurtenis is altijddenkt. - text —
{text}: de volledige tot dan zichtbare tekst (geen delta), maximaal elke 150 ms. - fertig —
{text, quellen, fortsetzung};fortsetzungis{art:"faden", id}(opgeslagen als gesprek),{art:"neu"}ofnull. - fehler —
{code, text?}metcode:aus,gesperrt,drossel,motor,zeit,einwilligung,ungueltig. Alsfehlernatextkomt, laat de tekst dan staan.
Na fertig of fehler eindigt de stream. Fouten vóór het starten komen ook als stream met precies één fehler (HTTP 404, 429, 400, 413, 503 of 200). Zonder tekst na 45 seconden of zonder einde na 90 seconden volgt fehler zeit. Als u de verbinding sluit, wordt het antwoord afgebroken. Een proxy onderweg moet de stream zonder buffering doorgeven.
// read the stream in the browser (EventSource cannot POST)
const r = await fetch('https://ws.reactive.chat/api/suche/SITE_KEY/antwort', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ q: frage, locale: 'en' }), credentials: 'omit'
});
const leser = r.body.getReader(); const dec = new TextDecoder(); let puffer = '';
for (;;) {
const { value, done } = await leser.read(); if (done) break;
puffer += dec.decode(value, { stream: true });
let i; while ((i = puffer.indexOf('\n\n')) >= 0) {
const block = puffer.slice(0, i); puffer = puffer.slice(i + 2);
const ev = /^event: (.*)$/m.exec(block), da = /^data: (.*)$/m.exec(block);
if (ev && da) zeige(ev[1], JSON.parse(da[1]));
}
}
Volgende: Privacyintegratie
Zadnja posodobitev: