Keural Kit
Script de incorporação que coloca as telas de chat, Drive e prompts do Keural dentro do seu serviço web.
O Keural Kit coloca telas do Keural na sua página com um único script. As telas são desenhadas dentro de um Shadow DOM, por isso não se misturam ao CSS da sua página. O Kit é atualizado a cada implantação da aplicação web do Keural. Se uma tela antiga continuar aparecendo depois de uma implantação, limpe o cache do navegador e da CDN e confira a data da compilação com window.KeuralKit.__build.
O Kit funciona com a sessão de login do Keural (cookie do domínio da API do Keural). userInfo é usado apenas para exibição na tela, e a identificação do usuário é feita pela sessão em cookie. Para usar no domínio do seu serviço, alinhe com o seu contato no Keural o registro do domínio e a integração de login (como SSO) antes da adoção.
Carregamento
O Kit é carregado do endereço web do ambiente Keural que você usa. Com keural.ai, o endereço é https://keural.ai; em ambientes locais ou dedicados, use o endereço web desse ambiente. Antes de incluir o script, defina em window.__KEURAL_ENV__ os endereços de servidor que o Kit vai chamar. Os três endereços devem ser do mesmo ambiente, e você os recebe do seu contato no Keural durante a adoção.
<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>| Valor | Descrição |
|---|---|
<KEURAL_WEB_URL> | Endereço web do Keural. Exemplo: https://keural.ai |
<KEURAL_API_URL> | Endereço do servidor de API do Keural. Exemplo: https://api.keural.ai |
<KEURAL_AGENT_URL> | Endereço do servidor de agentes do Keural |
NEXT_PUBLIC_MODE | prd para produção, dev para desenvolvimento |
Para usar o mesmo Kit em um segundo domínio, defina os três valores NEXT_PUBLIC_ADDITIONAL_FRONTEND_URL, NEXT_PUBLIC_ADDITIONAL_API_BASE_URL e NEXT_PUBLIC_ADDITIONAL_FAST_API_BASE_URL. Se algum deles faltar, ocorre um erro. Os valores são endereços https:// sem caminho.
Quando o script é carregado, window.KeuralKit é criado. Em SPAs como React, use um carregador para que o script seja carregado apenas uma vez.
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);
});
}Incorporar o chat
const el = document.getElementById('keural-chat')!;
window.KeuralKit.mountChat(el, {
userInfo: { userId: user.id, name: user.name },
colorMode: 'light',
initialData: { message: 'Resuma a receita deste trimestre', room_name: 'Relatório trimestral' },
onSessionCreated: (roomId) => router.push(`/c/${roomId}`),
onError: () => router.push('/'),
});
// Ao sair da tela
window.KeuralKit.unmount(el);- Para abrir uma conversa existente, informe o ID da conversa em
sessionId. - Inclua
initialDatasomente ao abrir uma conversa nova. Se ele for incluído ao abrir uma conversa existente, a mesma mensagem é enviada novamente. - Se
userInfo.userIdestiver ausente, o usuário é tratado como não logado. Monte o componente depois que as informações de login estiverem prontas.
Métodos
| Método | Descrição |
|---|---|
mountChat(el, options) | Tela de chat |
mountDrivePage(el, options) | Tela do Drive. Recebe os arquivos sobre os quais perguntar por meio de onAsk(files) |
mountPromptPage(el, options) | Tela de prompts. Recebe os prompts escolhidos por meio de onAsk(prompts) |
mountDriveDialog(el, options) / updateDriveDialog | Janela de seleção de arquivos do Drive (open obrigatório, onClose, onSelect(files), initialSelected) |
mountPromptDialog(el, options) / updatePromptDialog | Janela de seleção de prompts (open obrigatório, onClose, onSelect, onDefaultSelect, selectDefaultPrompt, defaultPromptDismissed) |
unmount(el) | Remove a tela montada |
Os métodos mount* e update* recebem colorMode e userInfo juntos, e unmount(el) recebe apenas o elemento. update* redesenha o mesmo elemento com as novas opções. Para abrir ou fechar a janela, altere o valor de open e chame update*. Se mount* for chamado novamente no mesmo elemento, a tela existente é reaproveitada.
Opções do mountChat
| Opção | Tipo | Descrição |
|---|---|---|
sessionId | string | ID da conversa a abrir. Se omitido, é uma conversa nova |
userInfo | { userId, name?, orgId?, orgName? } | Informações do usuário. userId é obrigatório |
initialData | object | Primeira mensagem de uma conversa nova. Veja initialData abaixo |
colorMode | 'light' | 'dark' | Tema. Padrão light |
initialEffort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | Nível inicial. Padrão fast |
initialWebSearch | boolean | Iniciar com a pesquisa na web ativada. Padrão true |
initialDeepResearch | boolean | Iniciar com o Deep Research ativado |
hideHomeButton / hideNewChatButton | boolean | Ocultar os botões do cabeçalho |
hideModePopup | boolean | Ocultar a janela de seleção de modo |
messageActions | { id, label, onClick(messageId) }[] | Adicionar ações próprias ao menu da resposta |
headerLeftActions / headerRightActions | HeaderLeftAction[] | Adicionar botões próprios ao cabeçalho |
onHeaderLeftMount | (el: HTMLElement) => void | Recebe o elemento quando a área esquerda do cabeçalho é desenhada |
mobileMenuItems / mobileBottomActions | array | Adicionar itens de menu ou botões inferiores em larguras móveis |
onMobileHomeButton | () => void | Quando o botão de início é pressionado em larguras móveis |
chatInputFooter | string | Texto de aviso abaixo da caixa de entrada |
shareTooltip | string | Texto da dica do botão de compartilhar |
onSessionCreated | (roomId) => void | Quando uma conversa nova é criada |
onStreamDone | (roomId) => void | Quando uma resposta termina |
onSummaryDone | (roomId) => void | Quando o título ou o resumo da conversa é criado |
onRoomInfo | (info) => void | Quando as informações da conversa mudam |
onShare / onExport | (roomId) => void | Quando o botão de compartilhar ou exportar é pressionado |
onError | (error: Error) => void | Quando ocorre um erro |
initialData
| Campo | Tipo | Descrição |
|---|---|---|
message | string | Obrigatório. Primeira mensagem |
files | FileType[] | Arquivos do Drive enviados junto (o valor recebido em onSelect de mountDriveDialog) |
prompts | object[] | Prompts usados junto |
webSearch | boolean | Pesquisa na web |
deepResearch | boolean | Deep Research |
effort | 'fast' | 'balanced' | 'high' | 'xhigh' | 'max' | Nível |
model | { label, value } | Modelo que responde |
room_name | string | Nome da conversa. Também aceita roomName, title e name. |
folder_id | string | null | Pasta onde salvar |
hideModePopup | boolean | Ocultar a janela de seleção de modo |
Idioma da tela
A tela do Kit é exibida em coreano.
Configurações e login
- As configurações do usuário são alteradas na aplicação web ou no app do Keural, e a tela do Kit segue essas configurações.
- O login é tratado pelo seu serviço, e ao Kit são enviadas apenas as informações do usuário logado.