Keural Kit
お使いのWebサービスの中に、Keuralのチャット・Drive・プロンプトの画面を埋め込むスクリプトです。
Keural Kitは、1つのスクリプトでKeuralの画面をお使いのページに埋め込みます。画面はShadow DOMの中に描画されるため、お使いのページのCSSと混ざることはありません。KitはKeuralのウェブ配布時に一緒に更新されます。配布後も古い画面が表示される場合は、ブラウザーとCDNのキャッシュを消去し、window.KeuralKit.__buildでビルド時刻を確認します。
Kitは、Keuralのログインセッション(Keural APIドメインのCookie)で動作します。userInfoは画面の表示用で、ユーザーの確認はCookieのセッションで行います。お使いのサービスのドメインで使うには、導入の前に、ドメインの登録とログイン連携(SSOなど)をKeuralの担当者と相談してください。
読み込み
Kitは、お使いのKeural環境のウェブアドレスから読み込みます。keural.aiの場合はhttps://keural.ai、オンプレミスや専用環境の場合は、その環境のKeuralウェブアドレスです。スクリプトより前に、Kitが呼び出すサーバーのアドレスをwindow.__KEURAL_ENV__に設定します。3つのアドレスは同じ環境のものである必要があり、導入時に担当者から受け取ります。
<script>
window.__KEURAL_ENV__ = {
NEXT_PUBLIC_API_BASE_URL: '<KEURAL_API_URL>',
NEXT_PUBLIC_FAST_API_BASE_URL: '<KEURAL_AGENT_URL>',
NEXT_PUBLIC_MODE: 'prd',
};
</script>
<script src="<KEURAL_WEB_URL>/plugin/kit/keural.js" async></script>| 値 | 内容 |
|---|---|
<KEURAL_WEB_URL> | Keuralウェブのアドレス。例: https://keural.ai |
<KEURAL_API_URL> | KeuralのAPIサーバーのアドレス。例: https://api.keural.ai |
<KEURAL_AGENT_URL> | Keuralエージェントサーバーのアドレス |
NEXT_PUBLIC_MODE | 本番環境はprd、開発環境はdev |
同じKitを2つ目のドメインでも使うには、NEXT_PUBLIC_ADDITIONAL_FRONTEND_URL、NEXT_PUBLIC_ADDITIONAL_API_BASE_URL、NEXT_PUBLIC_ADDITIONAL_FAST_API_BASE_URLの3つの値をすべて設定します。1つでも欠けるとエラーになります。値はパスのないhttps://アドレスです。
スクリプトが読み込まれると、window.KeuralKitが生成されます。ReactなどのSPAでは、スクリプトが1回だけ読み込まれるように、ローダーを作って使います。
export function loadKeuralKit(src = '<KEURAL_WEB_URL>/plugin/kit/keural.js') {
if (window.KeuralKit) return Promise.resolve(window.KeuralKit);
return new Promise((resolve, reject) => {
const s = document.createElement('script');
s.src = src;
s.async = true;
s.onload = () => resolve(window.KeuralKit);
s.onerror = () => {
s.remove();
reject(new Error('Keural Kit failed to load'));
};
document.head.appendChild(s);
});
}チャットを埋め込む
const el = document.getElementById('keural-chat')!;
window.KeuralKit.mountChat(el, {
userInfo: { userId: user.id, name: user.name },
colorMode: 'light',
initialData: { message: '今四半期の売上を要約して', room_name: '四半期レポート' },
onSessionCreated: (roomId) => router.push(`/c/${roomId}`),
onError: () => router.push('/'),
});
// 画面を離れるとき
window.KeuralKit.unmount(el);- 既存の会話を開くには、
sessionIdに会話IDを入れます。 initialDataは新しい会話を開くときだけ入れます。既存の会話を開くときに入れると、同じメッセージが再び送信されます。userInfo.userIdがない場合は、未ログインとして扱われます。ログイン情報の準備ができてから埋め込みます。
メソッド
| メソッド | 説明 |
|---|---|
mountChat(el, options) | チャットの画面 |
mountDrivePage(el, options) | Driveの画面。onAsk(files)で、質問するファイルを受け取ります |
mountPromptPage(el, options) | プロンプトの画面。onAsk(prompts)で、選んだプロンプトを受け取ります |
mountDriveDialog(el, options) / updateDriveDialog | Driveのファイル選択ウィンドウ(openが必須、onClose、onSelect(files)、initialSelected) |
mountPromptDialog(el, options) / updatePromptDialog | プロンプト選択ウィンドウ(openが必須、onClose、onSelect、onDefaultSelect、selectDefaultPrompt、defaultPromptDismissed) |
unmount(el) | 埋め込んだ画面を削除 |
mount*・update*メソッドは、colorModeとuserInfoを一緒に受け取ります。unmount(el)は要素だけを受け取ります。update*は、同じ要素を新しいオプションで描き直します。ウィンドウを開く・閉じるときは、openの値を変えてupdate*を呼び出します。同じ要素にmount*を再度呼び出すと、既存の画面を再利用します。
mountChatのオプション
| オプション | 型 | 説明 |
|---|---|---|
sessionId | string | 開く会話のID。ない場合は新しい会話 |
userInfo | { userId, name?, orgId?, orgName? } | ユーザー情報。userIdは必須 |
initialData | object | 新しい会話の最初のメッセージ。下のinitialDataを参照 |
colorMode | 'light' | 'dark' | テーマ。既定はlight |
initialEffort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | 最初のレベル。既定はfast |
initialWebSearch | boolean | ウェブ検索をオンにした状態で開始。既定はtrue |
initialDeepResearch | boolean | Deep Researchをオンにした状態で開始 |
hideHomeButton / hideNewChatButton | boolean | ヘッダーのボタンを非表示 |
hideModePopup | boolean | モード選択のポップアップを非表示 |
messageActions | { id, label, onClick(messageId) }[] | 回答のメニューに独自の操作を追加 |
headerLeftActions / headerRightActions | HeaderLeftAction[] | ヘッダーに独自のボタンを追加 |
onHeaderLeftMount | (el: HTMLElement) => void | ヘッダーの左側の領域が描画されると、その要素を受け取ります |
mobileMenuItems / mobileBottomActions | array | モバイルの幅で、メニューや下部のボタンを追加 |
onMobileHomeButton | () => void | モバイルの幅で、ホームボタンを押したとき |
chatInputFooter | string | 入力欄の下の案内文 |
shareTooltip | string | 共有ボタンのツールチップ |
onSessionCreated | (roomId) => void | 新しい会話が作成されたとき |
onStreamDone | (roomId) => void | 回答が終わったとき |
onSummaryDone | (roomId) => void | 会話のタイトル・要約が作成されたとき |
onRoomInfo | (info) => void | 会話の情報が変わったとき |
onShare / onExport | (roomId) => void | 共有・エクスポートボタンを押したとき |
onError | (error: Error) => void | エラーが発生したとき |
initialData
| フィールド | 型 | 説明 |
|---|---|---|
message | string | 必須。最初のメッセージ |
files | FileType[] | 一緒に送るDriveのファイル(mountDriveDialogのonSelectで受け取った値) |
prompts | object[] | 一緒に使うプロンプト |
webSearch | boolean | ウェブ検索 |
deepResearch | boolean | Deep Research |
effort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | レベル |
model | { label, value } | 回答するモデル |
room_name | string | 会話の名前。roomName・title・nameも受け付けます。 |
folder_id | string | null | 保存するフォルダー |
hideModePopup | boolean | モード選択のポップアップを非表示 |
画面の言語
Kitの画面は韓国語で表示されます。
設定とログイン
- ユーザーの設定は、Keuralのウェブまたはアプリで変更します。Kitの画面は、その設定に従います。
- ログインは、お使いのサービスが処理します。Kitには、ログインしたユーザーの情報だけを渡します。