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 em https://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

PropriedadeTipoObrigatórioDescrição
slugstring✅Identificador do avatar
subSlugstring❌Sub-identificador para variações do mesmo avatar
hostIdstring❌ID do host para contextos específicos
datasetIdstring❌ID do dataset para bases de conhecimento customizadas
socketUrlstring❌URL do servidor minichat. Use para apontar para outro ambiente (dev/staging). Padrão: https://minichat.tolky.to
theme"dark" | "light"❌Força o tema do widget. Sem esta opção, o widget acompanha o tema do sistema operacional do visitante
preFormboolean❌Pede nome, telefone e e-mail antes da primeira mensagem. Veja Pré-formulário
iconSizeDesktopstring | number❌Tamanho do botão flutuante no desktop. Veja Aparência do botão flutuante
iconSizeMobilestring | number❌Tamanho do botão flutuante no mobile
showCtaTextDesktopboolean❌Mostra ou esconde a etiqueta “Iniciar conversa” no desktop
showCtaTextMobileboolean❌Mostra ou esconde a etiqueta “Conversar” no mobile

Aparência do botão flutuante

Enquanto o chat está fechado, o widget aparece como um cartão quadrado num canto da tela: a imagem do avatar com uma etiqueta de convite embaixo. Quatro opções controlam esse cartão.

Todas as opções são opcionais e os padrões reproduzem o visual atual — se você não informar nenhuma delas, nada muda no seu site.

Tamanho

ValorDesktopMobile
"small"120px72px
"medium"160px (padrão)92px (padrão)
"large"200px120px
Número ou "180px"Livre entre 80px e 320pxLivre entre 56px e 200px

O cartão é quadrado — a altura acompanha a largura. Tudo que fica dentro dele (imagem, etiqueta, ícone, aviso de mensagem nova e o arredondamento das bordas) cresce e diminui junto, mantendo a proporção.

Valores fora dos limites são ajustados para o limite mais próximo. Um valor que não seja reconhecido cai no tamanho padrão e registra um aviso no console do navegador.

Etiqueta de convite

showCtaTextDesktop e showCtaTextMobile controlam a etiqueta arredondada com o texto de convite. Com false, a etiqueta some e o cartão fica só com a imagem — continuando clicável, e o aviso de mensagem nova continua aparecendo sobre ele.

As duas opções são independentes: dá para manter a etiqueta no desktop e removê-la no mobile.

<script>
  window.tolky = window.tolky || {
    config: {
      slug: "SLUG_DO_AVATAR",
      iconSizeDesktop: "large",
      iconSizeMobile: 72,
      showCtaTextMobile: false,
    },
  };
</script>

Desktop e mobile são definidos pela largura da janela, com corte em 768px — não pelo tipo de aparelho. Estreitar a janela do computador abaixo de 768px já aplica a configuração de mobile, sem recarregar a página.

Posição do botão flutuante

O visitante escolhe onde o botão fica, e a escolha é lembrada no navegador dele:

  • Arrastar: segurar o botão e soltar em qualquer lugar da tela. Ele encaixa sozinho na posição mais próxima entre nove (três colunas × três linhas). Funciona com mouse no desktop e com o dedo no mobile.
  • Menu de posições (só no desktop): passando o mouse sobre o botão aparece um ícone de três pontos no canto superior direito. Ele abre um mapa da tela em que basta clicar na posição desejada.

O botão começa no canto inferior direito.

Fixar o chat na lateral

No desktop, com uma conversa já iniciada, aparece um botão no topo do chat que fixa o chat como uma barra lateral: o chat ocupa a lateral inteira da janela e o conteúdo do seu site é empurrado para o lado, em vez de ficar coberto. O mesmo botão desfaz.

O lado escolhido acompanha a posição atual do botão flutuante — se ele estiver à esquerda, o chat fixa à esquerda.

Ao fixar, o widget aplica uma margem lateral no <body> da sua página e a remove ao desfixar ou ao fechar o chat. Se o seu layout usa posicionamento fixo que ignora a margem do <body>, vale conferir o resultado.

Pré-formulário

Com preForm: true, antes da primeira mensagem o chat mostra um formulário curto de identificação:

CampoObrigatório
Nome✅
Telefone (com seletor de país)✅
E-mail❌

Ao enviar, os dados viram a primeira mensagem da conversa e o visitante segue direto para o chat. A identificação fica registrada no navegador, então o formulário não reaparece a cada recarga.

<script>
  window.tolky = window.tolky || {
    config: {
      slug: "SLUG_DO_AVATAR",
      preForm: true,
    },
  };
</script>

Tema

Sem configuração, o widget acompanha o tema do sistema do visitante e troca sozinho se ele mudar de claro para escuro durante a navegação. Para fixar um dos dois, use theme:

<script>
  window.tolky = window.tolky || {
    config: {
      slug: "SLUG_DO_AVATAR",
      theme: "dark",
    },
  };
</script>

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.

AmbienteURL
Produçãohttps://minichat.tolky.to
Staginghttps://mini-chat.stg.tolky.to
Desenvolvimentohttps://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

Ao lado do nome do avatar, no topo do chat, 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.

EstadoCorSignificado
(oculto)—Ainda não há conversa ativa, ou o real-time não está configurado neste ambiente.
🟢 VerdeConectado à conversaO usuário está na room da conversa e recebe mensagens em tempo real normalmente.
🟠 Laranja, pulsandoReconectandoHavia 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:
DiretivaHosts/valoresPara quê
connect-srcwss://api.tolky.to https://api.tolky.toHandshake HTTP e WebSocket com o backend Tolky
script-srchttps://api.tolky.toCarregamento dinâmico do socket.io.js
style-srchttps://minichat.tolky.toStylesheets do widget carregados dentro do Shadow DOM
img-srchttps://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.js não foi compilado com a URL do servidor de socket. Confirme a URL no <script> e o socketUrl no window.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

ItemValor
Tipos aceitosimage/* (JPG, PNG, WebP, GIF…) e application/pdf
Tamanho máximo10 MB por arquivo
Quantidade1 anexo por mensagem
CompressãoImagens 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-data e roteia pelo servidor do minichat antes de chegar ao backend Tolky — o site host não precisa configurar nada especial além do CSP img-src mencionado 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 identificador da conversa e o do contato em localStorage (chaves tolky-minichat-conversation-id e tolky-minichat-lead-id).
  • Em cada nova carga, o widget chama GET /api/v1/conversation/{leadId} 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 GET e atualiza o histórico — mesmo efeito de um F5. 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 o localStorage para nova tentativa.

Chaves usadas no navegador

Em localStorage (sobrevivem ao fechamento do navegador):

ChaveConteúdo
tolky-minichat-conversation-idIdentificador da conversa em andamento
tolky-minichat-sessionIdentificador anônimo da sessão do navegador
tolky-minichat-lead-idIdentificador do contato vinculado à conversa
tolky-minichat-ever-openedMarca que o visitante já abriu o chat alguma vez neste navegador
tolky-minichat-pre-form-doneMarca que o visitante já preencheu o pré-formulário
tolky__widget_corner / tolky__mobile_cornerPosição do botão flutuante escolhida pelo visitante

Em sessionStorage (duram enquanto a aba estiver aberta):

ChaveConteúdo
tolkyChatInteractedIndica que há mensagem não lida com o chat fechado
tolkyChatUnreadCountQuantidade de mensagens não lidas exibida no aviso

Não há como encerrar a conversa pela interface do widget nem por chamada JavaScript. Para começar do zero, remova as chaves acima e recarregue a página.

Aviso de mensagem nova

Com o chat fechado, cada mensagem que chega acende uma bolinha vermelha com o contador de não lidas sobre o botão flutuante. O contador zera quando o visitante abre o chat, e mostra 99+ acima de noventa e nove.

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!");

Os métodos só existem depois que o widget termina de carregar. Se você chama algum deles logo no início da página, verifique antes se window.tolky.show existe.

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)

O widget inicia sozinho no load da página. Se o script for inserido depois que a página já carregou — o caso mais comum em Single Page Applications, e também quando se adia o carregamento para ganhar performance — esse evento já passou e o widget não inicia. Nesses casos, dispare loadingMinichat manualmente:

window.dispatchEvent(new Event("loadingMinichat"));

Exemplo carregando o widget só na primeira interação do visitante, para não competir com o carregamento inicial da página:

function carregarMinichat() {
  if (document.querySelector("script[data-tolky-minichat]")) return;

  window.tolky = window.tolky || {};
  window.tolky.config = { slug: "SLUG_DO_AVATAR" };

  const script = document.createElement("script");
  script.type = "module";
  script.src = "https://minichat.tolky.to/main.js";
  script.dataset.tolkyMinichat = "true";
  script.addEventListener("load", () => {
    window.dispatchEvent(new Event("loadingMinichat"));
  });
  document.body.appendChild(script);
}

["pointerdown", "keydown", "touchstart", "scroll"].forEach((evento) =>
  window.addEventListener(evento, carregarMinichat, { once: true, passive: true })
);
setTimeout(carregarMinichat, 6000); // garante o carregamento para quem não interage

Defina window.tolky.config antes de inserir o script. Um window.tolky = window.tolky || { config: {...} } só cria a configuração se o objeto ainda não existir — se algo na sua página já tiver criado window.tolky, a configuração é descartada e o widget não aparece. Atribuir window.tolky.config separadamente, como no exemplo acima, evita esse problema.

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.