Keural Kit
Скрипт для встраивания экранов чата, Drive и промптов Keural в ваш веб-сервис.
Keural Kit встраивает экраны Keural на страницу с помощью одного скрипта. Экраны рисуются внутри Shadow DOM, поэтому не смешиваются с CSS страницы. Kit обновляется при развёртывании веб-версии Keural. Если после развёртывания отображается старый экран, очистите кэш браузера и CDN и проверьте время сборки через window.KeuralKit.__build.
Kit работает на основе сеанса входа в Keural (cookie на домене API Keural). userInfo используется только для отображения, а проверка пользователя выполняется по cookie-сеансу. Чтобы использовать Kit на домене вашего сервиса, до подключения согласуйте регистрацию домена и интеграцию входа (например, SSO) с контактным лицом в Keural.
Загрузка
Kit загружается с веб-адреса используемой среды Keural. Для keural.ai это https://keural.ai, для локальной или выделенной среды укажите веб-адрес Keural этой среды. Перед добавлением скрипта задайте в window.__KEURAL_ENV__ адреса серверов, к которым будет обращаться Kit. Все три адреса должны относиться к одной среде. Получите их у контактного лица в Keural при подключении.
<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> | Адрес API-сервера Keural. Пример: https://api.keural.ai |
<KEURAL_AGENT_URL> | Адрес сервера агентов Keural |
NEXT_PUBLIC_MODE | prd для рабочей среды, dev для среды разработки |
Если тот же Kit используется на втором домене, укажите все три значения: NEXT_PUBLIC_ADDITIONAL_FRONTEND_URL, NEXT_PUBLIC_ADDITIONAL_API_BASE_URL и NEXT_PUBLIC_ADDITIONAL_FAST_API_BASE_URL. Если хотя бы одно из них отсутствует, возникает ошибка. Значения: адреса https:// без пути.
После загрузки скрипта создаётся window.KeuralKit. В SPA, например React, используйте загрузчик, который добавляет скрипт только один раз.
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);- Чтобы открыть существующий диалог, укажите его ID в
sessionId. 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, которые отправляются вместе (значение, полученное в onSelect из mountDriveDialog) |
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 получает только данные вошедшего пользователя.