Smart Answer:サイト内検索のAI回答
Smart Answerの埋め込み:suche.js、マークアップ内のボックス、サーバー生成の検索ページ用公開HTTPインターフェース、Server-Sent Eventsの回答ストリーム、CSS変数、チャットへの引き継ぎ。
Smart Answerは、サイト内検索の結果の上または下に、訪問者の質問への短い回答を表示します。ナレッジベースの出典付きでストリーミングし、次の質問用のフィールドもあります。Smart Answerは独立したサービスで、チャットアシスタントと同じナレッジベースを使います。アカウントのプロジェクト → サイト内検索のSmart Answerで有効化し、外観を設定します。
suche.jsで埋め込む
ページにチャットローダーがあれば、1行で済みます。
<script src="https://cdn.reactive.chat/suche.js" async></script>
チャットウィジェットがなければ、サイトキーを渡します。
<script src="https://cdn.reactive.chat/suche.js" data-site-key="SITE_KEY" async></script>
スクリプトは、ページの検索欄(対象はアカウントのCSSセレクターで指定)に接続し、送信または入力の停止を待ち、設定位置(対象要素の前、後、内部)のボックスに回答を表示します。既定では、質問と見なせる入力だけに回答します。
scriptタグの属性:
- data-site-key(任意) – なければチャットローダーの
data-rc-site-keyから引き継ぎます。 - data-ws-url(任意) – チャットのアドレス。なければチャットと同じ方法で導きます。
- data-api(任意) – インターフェースのベースアドレス。既定は
https://ws.reactive.chatまたは独自ドメイン。 - data-locale(任意) – 言語。なければ
<html lang>、次にブラウザーです。
スクリプトはCookieを設定せず、sessionStorageだけに保存します。CSPではscript-src https://cdn.reactive.chat とconnect-src https://ws.reactive.chat が必要です(セキュリティとCSP)。
チャットへの引き継ぎ
訪問者がボックスで追加質問をすると、追加質問の設定に応じて、チャットウィジェットで会話を続けるか(ReactiveChat('continueConversation', id, text)またはReactiveChat('startConversation', text))、同じボックスで回答します。ページにチャットウィジェットがなければ、追加質問は常にボックス内に残ります。
スタイル
ボックス(.rc-ai)には独自のCSSがあり、ページのリセットスタイルから保護されています。詳細度が最も低い変数で調整できます。
.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;
}
アカウントのカスタムCSSフィールドで、.rc-ai .rc-ai__teil { … }を使い個別の部分を変更します。例:.rc-ai .rc-ai__hinweis { display: none; }。保護レイヤーは、ページの#idや!importantを含むルールからは保護しません。
HTTPインターフェース
サーバー生成の検索ページや独自の画面向けに、認証もCookieも不要な公開インターフェースがあります。アドレスはhttps://ws.reactive.chat/api/suche/SITE_KEY.
全エンドポイント共通:
- CORSは、プロジェクトのドメインのオリジンのみ許可します(サブドメインを含む)。
Originのないサーバーからの呼び出しは、常に使えます。 - 頻度制限: 全エンドポイントを通して、訪問者のアドレスごとに毎分60リクエスト。超過時は
Retry-AfterとX-RateLimit-*付きの429です。サーバーから呼ぶと、そのサーバーのアドレスで数えるため、多数の訪問者にはブラウザー内のsuche.jsか、プロキシキー付きの独自ドメインを使ってください。 - 質問と回答をアクセスログに記録しません。
GET /api/suche/SITE_KEY?locale=de – 設定、CSS、空のボックステンプレート(Cache-Control: public, max-age=60):
{"v":1,"aktiv":false}– 無効、ブロック、または不明です(不明なキーは404)。{"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 – 質問用のボックスの完成したHTML。本文は最大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":""}– 入力は質問ではありません。{"v":1,"aktiv":true,"frage":true,"html":"…","css":"<style id=\"rc-ai-css\">…</style>","skript":"…","einbettung":"…"}–einbettungを検索ページに入れると、suche.jsがボックスに回答を表示します。- 400
{"v":1,"error":"bad_request","field":"q"}–qがない、空、または300文字を超えています。 - 413
payload_too_large。その他のメソッドは405。
POST /api/suche/SITE_KEY/antwort – Server-Sent Eventsストリームで回答本体を返します。本文は最大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(文字列、必須、1~300文字)
- locale(文字列、任意)
- visitor_id(文字列、任意、
[A-Za-z0-9_-]{1,80}) – チャットへの引き継ぎを一致させるための、チャット訪問者ID。 - ctx(オブジェクト、任意) –
url、path、referrer、title。クエリとアンカーを削除します。 - folge(
true、任意) – 追加質問。質問フィルターを迂回します。 - vorher(リスト、任意) – 最大3組の過去の質問と回答(
qは300文字以下、aは1,500文字以下)。
応答は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。最初のイベントは常にdenktです。 - text –
{text}:それまでに表示された全文(差分ではありません)。最大150 msに1回です。 - fertig –
{text, quellen, fortsetzung}。fortsetzungは{art:"faden", id}(会話として保存)、{art:"neu"}、またはnullです。 - fehler –
{code, text?}。codeはaus、gesperrt、drossel、motor、zeit、einwilligung、ungueltigです。textの後にfehlerが来た場合、テキストは残してください。
fertigまたはfehlerの後、ストリームは終了します。開始前のエラーも、fehler1つだけのストリームで返します(HTTP 404、429、400、413、503、200)。45秒間テキストがない、または90秒で終了しない場合は、fehler zeitが続きます。接続を閉じると回答を中断します。経路上のプロキシは、ストリームをバッファリングせずに通す必要があります。
// 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]));
}
}
最終更新: