Keural Kit
Skrip embed yang menempatkan layar chat, Drive, dan prompt Keural di dalam layanan web Anda.
Keural Kit menempatkan layar Keural di halaman Anda hanya dengan satu skrip. Layar digambar di dalam Shadow DOM sehingga tidak bercampur dengan CSS halaman Anda. Kit diperbarui saat web Keural dideploy. Jika layar lama masih tampil setelah deployment, hapus cache browser dan CDN, lalu periksa waktu build dengan window.KeuralKit.__build.
Kit bekerja dengan sesi login Keural (cookie di domain API Keural). userInfo hanya untuk tampilan, dan pengguna diverifikasi dengan sesi cookie. Untuk memakai Kit di domain layanan Anda, koordinasikan pendaftaran domain dan integrasi login (seperti SSO) dengan penanggung jawab Keural sebelum penerapan.
Memuat
Kit dimuat dari alamat web lingkungan Keural yang Anda gunakan. Jika memakai keural.ai, alamatnya https://keural.ai; untuk lingkungan on-premise atau khusus, gunakan alamat web Keural milik lingkungan tersebut. Sebelum skrip dimuat, atur alamat server yang akan dipanggil Kit di window.__KEURAL_ENV__. Ketiga alamat harus berasal dari lingkungan yang sama, dan diperoleh dari penanggung jawab saat penerapan.
<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>| Nilai | Keterangan |
|---|---|
<KEURAL_WEB_URL> | Alamat web Keural. Contoh: https://keural.ai |
<KEURAL_API_URL> | Alamat server API Keural. Contoh: https://api.keural.ai |
<KEURAL_AGENT_URL> | Alamat server agen Keural |
NEXT_PUBLIC_MODE | prd untuk produksi, dev untuk pengembangan |
Jika Kit yang sama juga digunakan di domain kedua, atur ketiga nilai NEXT_PUBLIC_ADDITIONAL_FRONTEND_URL, NEXT_PUBLIC_ADDITIONAL_API_BASE_URL, dan NEXT_PUBLIC_ADDITIONAL_FAST_API_BASE_URL sekaligus. Jika ada yang kurang, akan terjadi error. Nilainya berupa alamat https:// tanpa path.
Setelah skrip dimuat, window.KeuralKit dibuat. Pada SPA seperti React, gunakan loader agar skrip hanya dimuat sekali.
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);
});
}Memasang chat
const el = document.getElementById('keural-chat')!;
window.KeuralKit.mountChat(el, {
userInfo: { userId: user.id, name: user.name },
colorMode: 'light',
initialData: { message: 'Ringkas pendapatan kuartal ini', room_name: 'Laporan kuartal' },
onSessionCreated: (roomId) => router.push(`/c/${roomId}`),
onError: () => router.push('/'),
});
// Saat meninggalkan layar
window.KeuralKit.unmount(el);- Untuk membuka percakapan yang sudah ada, isi ID percakapan di
sessionId. initialDatahanya diisi saat membuka percakapan baru. Jika diisi saat membuka percakapan yang sudah ada, pesan yang sama akan terkirim ulang.- Jika
userInfo.userIdtidak ada, pengguna diperlakukan sebagai belum login. Pasang (mount) setelah informasi login siap.
Metode
| Metode | Keterangan |
|---|---|
mountChat(el, options) | Layar chat |
mountDrivePage(el, options) | Layar Drive. Menerima file yang akan ditanyakan melalui onAsk(files) |
mountPromptPage(el, options) | Layar prompt. Menerima prompt yang dipilih melalui onAsk(prompts) |
mountDriveDialog(el, options) / updateDriveDialog | Jendela pilih file Drive (open wajib, onClose, onSelect(files), initialSelected) |
mountPromptDialog(el, options) / updatePromptDialog | Jendela pilih prompt (open wajib, onClose, onSelect, onDefaultSelect, selectDefaultPrompt, defaultPromptDismissed) |
unmount(el) | Menghapus layar yang sudah dipasang |
Metode mount* dan update* menerima colorMode dan userInfo bersamaan, sedangkan unmount(el) hanya menerima elemen. update* menggambar ulang opsi pada elemen yang sama. Saat membuka dan menutup jendela, ubah nilai open lalu panggil update*. Jika mount* dipanggil lagi pada elemen yang sama, layar yang sudah ada akan dipakai ulang.
Opsi mountChat
| Opsi | Tipe | Keterangan |
|---|---|---|
sessionId | string | ID percakapan yang akan dibuka. Jika tidak ada, percakapan baru |
userInfo | { userId, name?, orgId?, orgName? } | Informasi pengguna. userId wajib |
initialData | object | Pesan pertama percakapan baru. Lihat initialData di bawah |
colorMode | 'light' | 'dark' | Tema. Default light |
initialEffort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | Tingkat awal. Default fast |
initialWebSearch | boolean | Mulai dengan pencarian web aktif. Default true |
initialDeepResearch | boolean | Mulai dengan Deep Research aktif |
hideHomeButton / hideNewChatButton | boolean | Menyembunyikan tombol di header |
hideModePopup | boolean | Menyembunyikan popup pemilihan mode |
messageActions | { id, label, onClick(messageId) }[] | Menambahkan aksi sendiri ke menu jawaban |
headerLeftActions / headerRightActions | HeaderLeftAction[] | Menambahkan tombol sendiri ke header |
onHeaderLeftMount | (el: HTMLElement) => void | Menerima elemen area kiri header saat area tersebut digambar |
mobileMenuItems / mobileBottomActions | array | Menambahkan menu dan tombol bawah pada lebar layar mobile |
onMobileHomeButton | () => void | Saat tombol beranda ditekan pada lebar layar mobile |
chatInputFooter | string | Teks keterangan di bawah kolom input |
shareTooltip | string | Teks tooltip tombol bagikan |
onSessionCreated | (roomId) => void | Saat percakapan baru dibuat |
onStreamDone | (roomId) => void | Saat jawaban selesai |
onSummaryDone | (roomId) => void | Saat judul dan ringkasan percakapan dibuat |
onRoomInfo | (info) => void | Saat informasi percakapan berubah |
onShare / onExport | (roomId) => void | Saat tombol bagikan atau ekspor ditekan |
onError | (error: Error) => void | Saat terjadi error |
initialData
| Field | Tipe | Keterangan |
|---|---|---|
message | string | Wajib. Pesan pertama |
files | FileType[] | File Drive yang dikirim bersama (nilai dari onSelect pada mountDriveDialog) |
prompts | object[] | Prompt yang dipakai bersama |
webSearch | boolean | Pencarian web |
deepResearch | boolean | Deep Research |
effort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | Tingkat |
model | { label, value } | Model yang menjawab |
room_name | string | Nama percakapan. roomName, title, dan name juga diterima. |
folder_id | string | null | Folder tempat menyimpan |
hideModePopup | boolean | Menyembunyikan popup pemilihan mode |
Bahasa layar
Layar Kit ditampilkan dalam bahasa Korea.
Pengaturan dan login
- Pengaturan pengguna diubah di web atau aplikasi Keural, dan layar Kit mengikuti pengaturan tersebut.
- Login ditangani oleh layanan Anda, dan Kit hanya menerima informasi pengguna yang sudah login.