SDK de incorporação do widget

Controle o widget Agentkit no navegador, envie mensagens proativas, aplique opções da página e escute eventos.

O SDK permite que sua página abra, feche, redefina, configure e observe o balão de chat do Agentkit. Ele está disponível apenas na incorporação por script. A incorporação por iframe não define window.agentkit.

Instalar a fila

Use o trecho da página Canais do seu agente. A fila faz com que chamadas antes e depois do carregamento do script assíncrono tenham o mesmo comportamento.

<script>
  (function (w) {
    if (w.agentkit) return;
    var q = [];
    var agentkit = function () { q.push(arguments); };
    agentkit.q = q;
    w.agentkit = agentkit;
  })(window);
</script>
<script async data-chatbot="YOUR_CHATBOT_ID" src="https://YOUR_WIDGET_HOST/agentkit-chatbot.js"></script>

A incorporação antiga com uma única tag continua funcionando. Adicione a fila se chamar o SDK antes de o bundle terminar de carregar.

Controlar o widget e enviar mensagens

window.agentkit('open');
window.agentkit('close');
window.agentkit('open', { message: 'Can you help me choose a plan?' });

Com hideMessage, a mensagem proativa não aparece na conversa e o widget permanece fechado até o assistente começar a responder.

window.agentkit('open', {
  message: 'Explain the current page in one sentence.',
  hideMessage: true,
});

O SDK recusa mensagens vazias, envios simultâneos ou limitados e envios quando o campo está oculto ou desativado ou há um chat ao vivo. close não encerra um chat ao vivo do Salesforce.

Enviar enquanto o widget permanece fechado

Use send quando a página oferece um campo de pergunta compacto e mostra a resposta fora do widget. A mensagem entra na conversa normal sem abrir a apresentação. Escute o evento do assistente e chame open depois para continuar a mesma conversa.

let pendingQuestion = null;
let questionAccepted = false;

function onUserMessage(event) {
  if (event.detail.content === pendingQuestion) questionAccepted = true;
}

function showAnswer(event) {
  if (!questionAccepted) return;
  document.querySelector('#answer').textContent = event.detail.content;
  pendingQuestion = null;
  questionAccepted = false;
}

window.agentkit('addEventListener', 'user-message', onUserMessage);
window.agentkit('addEventListener', 'assistant-message', showAnswer);

pendingQuestion = 'Do you offer a free plan?';
window.agentkit('send', { message: pendingQuestion });

// Later, from a “Continue in chat” control:
window.agentkit('open');

send usa as mesmas verificações, limites, persistência e eventos de open({ message }). Só muda se a apresentação abre.

Center Stage

O Center Stage abre o mesmo agente como um diálogo centralizado em tela cheia sobre a sua página, em vez do balão no canto. É um canal próprio na página Canais, com exibição, voz, instruções e ações próprias, e fica desligado até você ativá-lo lá.

Instale-o com o mesmo bootstrap e adicione data-display="center-stage" à tag script. O atributo fica ao lado de data-chatbot e data-locale:

<script async data-chatbot="YOUR_CHATBOT_ID" data-display="center-stage" src="https://YOUR_WIDGET_HOST/agentkit-chatbot.js"></script>

O launcher continua sendo a forma padrão de abri-lo, e cada chamada do SDK funciona igual: open mostra o diálogo, close o fecha, e resetChat, setOptions, identify, eventos e ferramentas do navegador se comportam exatamente como no balão. O diálogo retém o foco, fecha com Escape ou com o botão de fechar, devolve o foco ao que o abriu e ocupa a tela inteira em celulares.

Só uma apresentação do Agentkit pode rodar por página. Se dois scripts de incorporação carregarem, o data-display do primeiro vence e uma duplicata divergente registra um aviso no console em vez de montar um segundo widget. As configurações e o chat do Center Stage carregam de endpoints próprios, então desativar o canal na página Canais o interrompe em todos os sites mesmo com o balão ativo.

Redefinir o chat e as opções

window.agentkit('resetChat');

O comando apaga a conversa em cache e cria um novo id. A identidade e as opções temporárias da página são mantidas.

window.agentkit('setOptions', {
  title: 'Checkout assistant',
  conversation: {
    messagePlaceholder: 'Ask about checkout',
    initialMessages: ['Need help finishing your order?'],
    defaultPrompts: {
      prompts: ['Delivery times', 'Returns', 'Payment methods'],
    },
  },
});
window.agentkit('resetOptions');
window.agentkit('resetOptions', [
  'title',
  'conversation.initialMessages',
]);

As chaves aceitas são title, conversation.messagePlaceholder, conversation.initialMessages e conversation.defaultPrompts.prompts. Cada chave é validada separadamente. Os valores existem apenas na página atual e não alteram configurações salvas nem o armazenamento local.

Eventos

function onAssistantMessage(event) {
  console.log(event.detail.conversationId);
  console.log(event.detail.content);
}

window.agentkit(
  'addEventListener',
  'assistant-message',
  onAssistantMessage,
);

// Clean up when this page or route no longer needs the listener.
window.agentkit(
  'removeEventListener',
  'assistant-message',
  onAssistantMessage,
);

Use a mesma referência de função para remover o listener. Os eventos são user-message, assistant-message, tool-call e tool-result. Eventos de mensagem incluem { conversationId, content }. Eventos de ferramenta são emitidos antes e depois da execução das ferramentas do navegador registradas. Um erro em um listener não interrompe o widget.

Registrar ferramentas do navegador

Crie uma ação do lado do cliente no painel e registre um handler com exatamente o mesmo nome de ação em cada página onde o widget possa aparecer. Registrar novamente substitui o registro completo, o que torna a limpeza por rota previsível em aplicações de página única.

window.agentkit('registerTools', {
  checkInventory: async ({ args, signal }) => {
    const response = await fetch(`/api/inventory?sku=${args.sku}`, { signal });

    if (!response.ok) {
      return { status: 'error', error: 'Inventory is unavailable.' };
    }

    return { status: 'success', data: await response.json() };
  },
});

Os handlers recebem { args, toolCallId, signal }. Retorne { status: 'success', data } ou { status: 'error', error }; um valor de retorno compatível com JSON é tratado como sucesso. O widget cancela o trabalho após 60 segundos e converte handlers ausentes, exceções lançadas, timeouts e resultados inválidos em resultados de erro delimitados, para que o assistente possa continuar a conversa.

Trate os argumentos das ferramentas como entrada não confiável. Mantenha credenciais privilegiadas no seu próprio servidor, repasse o signal de cancelamento fornecido às requisições de rede e nunca retorne segredos ou dados pessoais desnecessários. Ferramentas de cliente exigem o embed por script; o embed por iframe não consegue acessar funções da página hospedeira.

Os comandos de identidade existentes continuam compatíveis:

window.agentkit('identify', { token: newToken });
window.agentkit('resetUser');

Consulte Verificação de identidade.

No TypeScript, importe o contrato Agentkit de @kit/chatbot-widget/sdk; no navegador ele fica em window.agentkit. Eventos de mensagem incluem conversationId e content, e eventos de ferramenta acrescentam toolCallId, toolName, input e output. Os comandos setOptions, resetOptions, resetChat, identify e resetUser são tipados.