Integrar minichat com meu site
Guia passo a passo para instalar e configurar o minichat do Tolky no seu site, incluindo a inserção de código HTML e CSS, e o registro de domínios autorizados para uso.
Visão Geral
Como instalar o Minichat no seu site ou aplicação web. O processo inclui a adição de código HTML e CSS ao seu site e o registro de seus domínios para uso autorizado.
Código de Instalação
Coloque o código abaixo antes da tag </body>. O bloco de configuração deve vir antes do script principal:
<script>
window.tolky = window.tolky || {
config: {
slug: "SLUG_DO_AVATAR",
},
};
</script>
<script type="module" src="https://minichat.tolky.to/main.js" async></script>
SLUG_DO_AVATAR: é o identificador do avatar — o mesmo nome usado emhttps://tolky.to/slug_do_avatar
Não é necessário adicionar nenhum <link> de CSS no <head> — o widget vive isolado em um Shadow DOM e injeta os estilos internamente.
Isolamento de CSS
O widget é encapsulado em Shadow DOM. Isso significa que:
- O CSS do seu site não afeta a aparência do widget.
- O CSS do widget não vaza para o seu site.
Se o seu site usa classes genéricas como .message, .image, .audio, .video ou .chat-container, elas convivem sem interferência com a renderização interna do widget.
Opções de Configuração
| Propriedade | Tipo | Obrigatório | Descrição |
|---|---|---|---|
slug | string | ✅ | Identificador do avatar |
subSlug | string | ❌ | Sub-identificador para variações do mesmo avatar |
hostId | string | ❌ | ID do host para contextos específicos |
datasetId | string | ❌ | ID do dataset para bases de conhecimento customizadas |
socketUrl | string | ❌ | URL do servidor minichat. Use para apontar para outro ambiente (dev/staging). Padrão: https://minichat.tolky.to |
Apontando para outro ambiente
Por padrão, o widget se conecta ao minichat de produção (https://minichat.tolky.to). Para apontar o widget para um ambiente diferente (homologação, desenvolvimento), troque a URL no <script> para o ambiente correspondente e defina socketUrl com o mesmo valor.
| Ambiente | URL |
|---|---|
| Produção | https://minichat.tolky.to |
| Staging | https://mini-chat.stg.tolky.to |
| Desenvolvimento | https://mini-chat.dev.tolky.to |
Exemplo apontando para staging:
<script>
window.tolky = window.tolky || {
config: {
slug: "SLUG_DO_AVATAR",
socketUrl: "https://mini-chat.stg.tolky.to",
},
};
</script>
<script type="module" src="https://mini-chat.stg.tolky.to/main.js" async></script>
As duas URLs (script e socketUrl) precisam apontar para o mesmo ambiente. Caso contrário, o widget pode carregar de um lugar e fazer requisições para outro.
Conversa em tempo real (WebSocket)
Quando o usuário envia a primeira mensagem, o widget abre uma conexão WebSocket com o backend Tolky (api.tolky.to em produção) e entra na “room” daquela conversa específica. Isso é o que permite receber respostas da IA e mensagens do gestor em tempo real, sem refresh.
Indicador visual de status
No topo do chat, ao lado do botão de fechar, aparece uma pequena bolinha indicando o estado da conversa em tempo real. O indicador só fica visível depois que a primeira mensagem é enviada — antes disso não há conversa, e portanto nada para indicar.
| Estado | Cor | Significado |
|---|---|---|
| (oculto) | — | Ainda não há conversa ativa, ou o real-time não está configurado neste ambiente. |
| 🟢 Verde | Conectado à conversa | O usuário está na room da conversa e recebe mensagens em tempo real normalmente. |
| 🟠 Laranja, pulsando | Reconectando | Havia uma conversa ativa, mas a conexão caiu. O cliente tenta reentrar na room automaticamente. |
Passar o mouse sobre o indicador exibe um tooltip com a descrição do estado.
Requisitos de rede
A conexão usa wss:// (WebSocket sobre TLS). Se o seu site está atrás de um firewall corporativo ou proxy:
- Permita
wss://api.tolky.to(ou a URL equivalente do ambiente que você usa). - Permita também
https://api.tolky.to/socket.io/socket.io.js(script carregado dinamicamente para inicializar o cliente Socket.IO). - Se o seu site usa Content Security Policy, configure as diretivas abaixo:
| Diretiva | Hosts/valores | Para quê |
|---|---|---|
connect-src | wss://api.tolky.to https://api.tolky.to | Handshake HTTP e WebSocket com o backend Tolky |
script-src | https://api.tolky.to | Carregamento dinâmico do socket.io.js |
style-src | https://minichat.tolky.to | Stylesheets do widget carregados dentro do Shadow DOM |
img-src | https://nkjijobbprgiftwtwucv.supabase.co blob: | Renderizar anexos enviados pelo usuário e o preview local antes do upload |
A política CSP do documento principal continua governando o conteúdo do Shadow DOM — o encapsulamento isola o CSS, não a CSP.
Se o widget estiver carregando estilos/script de um ambiente que não é produção (ex: mini-chat.dev.tolky.to), troque api.tolky.to pelo host equivalente desse ambiente.
Solução de problemas
O indicador fica laranja indefinidamente:
- Verifique no DevTools (aba Network → WS) se há um handshake em
/socket.io/?EIO=...retornando 200. - Confirme que
wss://api.tolky.to(ou a URL do seu ambiente) não está bloqueado por proxy/firewall. - Veja o console do navegador: o cliente loga
[tolky socket]em todos os eventos relevantes.
O indicador nunca aparece (mesmo após enviar mensagem):
- O ambiente que serve o
main.jsnão foi compilado com a URL do servidor de socket. Confirme a URL no<script>e osocketUrlnowindow.tolky.config.
Envio de anexos
O usuário pode enviar arquivos junto com a mensagem clicando no ícone de clipe ao lado do campo de texto. O arquivo é interpretado pela IA multimodal para responder com base no conteúdo (ex: descrever uma imagem, resumir um PDF).
Tipos e limites
| Item | Valor |
|---|---|
| Tipos aceitos | image/* (JPG, PNG, WebP, GIF…) e application/pdf |
| Tamanho máximo | 10 MB por arquivo |
| Quantidade | 1 anexo por mensagem |
| Compressão | Imagens são automaticamente reduzidas a 800×800 e convertidas para JPEG (qualidade 0.6) antes do upload, para economizar banda |
Comportamento
- O preview do arquivo aparece acima do campo de texto e pode ser removido pelo botão ”×” antes do envio.
- O envio usa
multipart/form-datae roteia pelo servidor do minichat antes de chegar ao backend Tolky — o site host não precisa configurar nada especial além do CSPimg-srcmencionado acima. - A URL pública do anexo é incluída no histórico da conversa como markdown de imagem, e renderizada inline para imagens.
Restrições do navegador
- O
<input type="file">precisa de gesto do usuário para abrir o seletor — não é possível abrir programaticamente sem clique. - Em navegadores antigos sem suporte a
URL.createObjectURL, o preview não aparece, mas o upload ainda funciona.
Download de mídia
Mensagens com mídia (imagem, áudio ou vídeo) — sejam enviadas pelo usuário, pela IA ou pelo gestor — exibem um botão de download circular no canto inferior direito da bolha. O clique baixa o arquivo original (não a versão comprimida do preview).
Para documentos (PDFs), o botão de download já vem como parte do componente nativo, ao lado do nome do arquivo.
Mensagens “só mídia” (sem texto) enviadas pelo gestor — por exemplo, quando o atendente compartilha apenas uma imagem ou PDF — também são entregues em tempo real e renderizadas com o botão de download.
Indicador “digitando”
Quando o usuário envia uma mensagem, três pontinhos animados aparecem indicando que o avatar está pensando. Detalhes do comportamento:
- Delay de 4 segundos: os pontinhos só aparecem se a resposta demorar mais de 4 s. Respostas rápidas não acionam o indicador, evitando “flash” desnecessário.
- Conversa pausada (atendimento humano): quando a conversa está em modo
is_paused = true(gestor assumiu o atendimento), os pontinhos nunca aparecem — não há IA pensando para indicar. - O indicador desaparece automaticamente assim que qualquer mensagem do avatar/gestor chega, seja via socket ou via resposta da requisição.
Persistência da conversa
O widget mantém a conversa entre recargas da página (F5, navegação para outra página do site, fechamento e reabertura do navegador).
Como funciona
- Após a primeira mensagem, o widget guarda o
conversationIdemlocalStorage(chavetolky-minichat-conversation-id). - Em cada nova carga, o widget chama
GET /api/v1/conversation/{id}no servidor do minichat (que proxia para o backend Tolky), recebe o histórico completo + estado da conversa e renderiza imediatamente — sem o usuário precisar começar do zero. - Ao reabrir o widget (clicar no X para fechar e depois reabrir), o widget refaz o mesmo
GETe atualiza o histórico — mesmo efeito de umF5. Cobre mensagens novas que possam ter chegado enquanto o chat estava fechado. - O estado de pausa (
is_paused) também é restaurado, então o indicador de digitando volta a respeitar o modo de atendimento humano sem precisar esperar uma nova mensagem. - Se a conversa salva não existir mais (foi deletada/expirou), o
localStorageé limpo automaticamente e o usuário cai no fluxo de boas-vindas normal. Erros de rede preservam olocalStoragepara nova tentativa.
Chaves usadas em localStorage
| Chave | Conteúdo |
|---|---|
tolky-minichat-conversation-id | UUID da conversa em andamento |
tolky-minichat-session | Identificador anônimo da sessão do navegador |
Como encerrar e começar uma conversa nova
O usuário pode encerrar a conversa diretamente pelo widget, sem precisar de reload.
- Pela UI: enquanto há uma conversa ativa, aparece um botão circular no header (ao lado do
Xde fechar) com ícone de “recomeçar”. Ao clicar, o widget pede confirmação e, se aceito, descarta a conversa atual e volta para a tela de boas-vindas. - Programaticamente: chame
window.tolky.endConversation()(também disponível na API JavaScript).
O encerramento limpa apenas o tolky-minichat-conversation-id e sai da room do socket — a tolky-minichat-session (identidade anônima do navegador) é mantida, então o backend continua reconhecendo o mesmo usuário, só com uma conversa nova.
O encerramento é local: o backend continua guardando o histórico da conversa anterior; o widget apenas começa um novo thread. Para resetar também a identidade do navegador, remova adicionalmente a chave tolky-minichat-session antes de chamar endConversation().
Modo privado/incognito
Em janelas privadas o localStorage pode estar desabilitado ou ser efêmero — nesses casos o comportamento é “começar do zero a cada carga”. O widget detecta isso silenciosamente e não falha.
API JavaScript
Após a inicialização, o widget expõe métodos em window.tolky para controle programático:
// Abre o painel de chat
window.tolky.show();
// Fecha o painel de chat (volta para o botão)
window.tolky.hide();
// Torna o widget visível na página
window.tolky.open();
// Remove o widget completamente da página
window.tolky.close();
// Envia uma mensagem programaticamente (abre o chat automaticamente)
window.tolky.sendMessage("Olá, preciso de ajuda!");
// Encerra a conversa atual e volta para a tela de boas-vindas (sem reload).
// Mantém a identidade anônima do navegador — só zera o thread da conversa.
window.tolky.endConversation();
Exemplo: Abrir o chat ao clicar em um botão customizado
document.getElementById("meu-botao").addEventListener("click", () => {
window.tolky.show();
});
Exemplo: Enviar uma mensagem ao entrar na página
window.addEventListener("load", () => {
window.tolky.sendMessage("Quero saber sobre planos e preços");
});
Inicialização em SPAs (React, Vue, Angular)
Em Single Page Applications onde o window.onload pode não ser re-disparado após navegação, use o evento loadingMinichat para inicializar o widget manualmente:
window.dispatchEvent(new Event("loadingMinichat"));
Liberação de Domínios
Para garantir segurança e uso exclusivo do Minichat, é necessário registrar os domínios autorizados.
Como Registrar os Domínios
Envie um e-mail para admin@tolky.to com as seguintes informações:
Assunto do E-mail: Liberação de Domínios
Mensagem do E-mail: Deve conter a lista dos domínios que terão permissão para usar o minichat. Exemplo de formato:
Eu autorizo o acesso ao minichat para os domínios a seguir:
- http://meudominio1.com.br
- http://meudominio2.com.br
Depois disso, o Minichat estará ativo no seu site.