Pular para o conteúdo principal

Widgets de Website

Incorpore o seu agente de voz em qualquer site para que os visitantes possam iniciar uma conversa de voz diretamente do browser. A aba Widgets fornece códigos de incorporação, opções de personalização e definições de segurança de domínio.

À procura do widget de callback?

O Widget de Callback funciona de forma muito diferente dos widgets nesta página — em vez de iniciar uma chamada de voz no browser, recolhe o número de telefone do visitante e faz o seu agente ligar-lhes de volta. Veja a página dedicada Widget de Callback.

Tipos de Widget

A Hanc.AI oferece quatro tipos de widget no browser, mais um Widget de Callback separado para callbacks telefónicos:

WidgetNome da TagDescriçãoMelhor Para
Floating Widgethanc-ai-floating-callBotão orbe que flutua sobre a sua páginaCall-to-action sempre visível
Pill Widgethanc-ai-pill-callBotão compacto em forma de pill colocado inline no seu conteúdoPegada mínima dentro de um layout existente
Pill Floating Widgethanc-ai-pill-floating-callMesma forma compacta de pill que o Pill, mas flutua com a página como o widget FloatingQuando quer uma estética de pill que segue o visitante enquanto ele faz scroll
Inline Widgethanc-ai-inline-callBotão de chamada em tamanho completo incorporado no conteúdo da páginaSecções dedicadas "Fale Connosco"
Callback Widgethanc-ai-callbackFormulário de número de telefone; o agente liga de volta ao visitantePáginas de geração de leads, landing pages de alta intenção — veja Widget de Callback

Atributos Comuns

Todos os tipos de widget suportam estes atributos principais:

AtributoObrigatórioDescriçãoPadrão
agent-idSimO identificador único do seu agente
voice-service-urlNãoSobrepõe o URL do serviço de vozDetetado automaticamente
api-base-urlNãoSobrepõe o URL base da APIDetetado automaticamente

Atributos de Apresentação

AtributoDescriçãoValoresPadrão
positionPosição do widget na páginabottom-right, bottom-left, top-right, top-left, staticbottom-right
sizeTamanho do widget em píxeisNúmero120
themeNome do tema de corVeja Temas de Cordefault

Atributos de Texto do Botão

AtributoDescriçãoPadrão
button-start-textTexto mostrado no botão inativo"Call"
button-connecting-textTexto mostrado durante a ligação"Connecting..."
button-end-textTexto mostrado durante uma chamada ativa

Atributos de Termos

AtributoDescriçãoPadrão
terms-enabledAtivar o diálogo de consentimento antes da chamadafalse
terms-contentTexto de consentimento formatado em Markdown""
terms-urlLink para a sua página de Termos e Condições"https://hanc.ai/terms"
privacy-urlLink para a sua página de Política de Privacidade"https://hanc.ai/privacy"
informação

Os atributos de termos definidos no elemento HTML são sobrepostos pelas definições de widget do agente obtidas da API, a menos que skip-fetch esteja definido como true.

Atributos de Som

AtributoDescriçãoPadrão
sound-enabledAtivar sons de início/fim de chamadatrue
sound-volumeVolume do efeito sonoro0.25
sound-presetIdentificador do preset de som"1"

Temas de Cor

Personalize a aparência do widget com 11 temas de cor integrados:

TemaValor
Defaultdefault
Purplepurple
Blueblue
Cyancyan
Emeraldemerald
Amberamber
Tangerinetangerine
Roserose
Emberember
Blackblack
Whitewhite

Cada tema tem variantes escura e clara. Defina o tema através do atributo theme no código de incorporação, ou configure-o nas definições de widget do agente.


Exemplos de Incorporação

Floating Widget

<hanc-ai-floating-call agent-id="YOUR_AGENT_ID"></hanc-ai-floating-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Floating Widget com Tema e Posição

<hanc-ai-floating-call
agent-id="YOUR_AGENT_ID"
theme="emerald"
position="bottom-left"
size="140"
></hanc-ai-floating-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Pill Widget

<hanc-ai-pill-call agent-id="YOUR_AGENT_ID"></hanc-ai-pill-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Inline Widget

<hanc-ai-inline-call agent-id="YOUR_AGENT_ID"></hanc-ai-inline-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>
Fixar uma versão do widget

O URL do script acima carrega sempre o widget lançado mais recentemente — o seu site adota melhorias automaticamente, e @latest é o padrão quando nenhuma versão é especificada. Se precisar de fixar uma versão específica, faça-o explicitamente acrescentando a versão que quer, ex.: https://unpkg.com/hanc-webrtc-widgets@X.Y.Z.


Eventos do Widget

Os widgets emitem eventos que pode escutar em JavaScript:

EventoDescrição
status-changedDisparado quando o estado da chamada muda
connectingA chamada está a ser estabelecida
connectedA chamada está ativa
idleNenhuma chamada ativa
errorOcorreu um erro
audio-trackFaixa de áudio remota recebida (para visualização)
local-audio-trackFaixa de áudio do microfone local (para visualização)
microphone-enabledO microfone foi ativado
microphone-disabledO microfone foi desativado
call-startDisparado quando uma chamada inicia com sucesso
call-endDisparado quando a chamada termina

Exemplo: Escutar Eventos

const widget = document.querySelector('hanc-ai-floating-call');

widget.addEventListener('call-start', () => {
console.log('Call started');
});

widget.addEventListener('call-end', () => {
console.log('Call ended');
});

Deixar o agente abrir páginas

Durante uma chamada pelo navegador, o agente pode pedir ao seu site que abra uma página — «deixe-me mostrar-lhe os preços» — e o visitante vê isso acontecer sem interromper a conversa.

Quem manda é a sua página. O agente envia um pedido; o seu código decide o que ele significa. Abrir um URL, mudar de separador, deslocar até uma secção e expandir um acordeão são todas respostas válidas.

São três passos, e nenhum funciona sozinho.

Passo 1 — Diga ao agente que páginas existem

O agente não vê o mapa do seu site. Só pede caminhos que lhe tenha dado — enumere-os no prompt do agente ou na base de conhecimento:

Páginas do nosso site:
/pricing — planos e preços
/contact — formulário de contacto e telefone
/product/crm — o CRM

Sem este passo o agente não tem o que pedir e nem sequer tenta.

Passo 2 — Trate o pedido na sua página

Acrescente isto uma vez, em qualquer ponto depois do script do widget. O evento sobe pela página, por isso document é um bom sítio para escutar:

<script>
document.addEventListener('agent-command', (event) => {
const { type, payload } = event.detail;

if (type === 'navigate') {
// SPA: navegar sem recarregar — a chamada continua.
router.push(payload.path);

// Site clássico: abrir um segundo separador; este (e a chamada) continua vivo.
// window.open(payload.path, '_blank');

event.preventDefault(); // ← é isto que diz ao agente «tratado»
}
});
</script>
Um recarregamento completo termina a chamada

A chamada vive nesta página. window.location.href = … descarrega o documento e a conversa vai com ele — o visitante é cortado a meio da frase. Se tiver um router, navegue do lado do cliente; caso contrário, abra a página num separador novo. Não há reconexão: nada sobrevive a um recarregamento.

preventDefault() não é opcional

É a única forma de dizer «tratei disto». Sem ele, o agente fica a saber que o site não suporta navegação: deixa de tentar durante o resto da chamada e volta a descrever onde clicar. Na consola não aparece nada — a página apenas parece ter ignorado o pedido, porque ignorou.

Passo 3 — Experimente

Ligue ao seu agente a partir do site e peça-lhe uma página pelo nome. Devem acontecer duas coisas: a página abre e o agente diz algo como «aqui estão os preços» em vez de «encontra-os no menu».


Responder ao agente com dados

Alguns comandos são perguntas, não instruções. Chegam da mesma maneira, mas responde-se com respond():

ComandoO que o agente perguntaCom o que responde
navigate«abre este caminho»com nada — basta preventDefault()
page_context«o que está o visitante a ver?»o que for útil: caminho, título, produto
cart_state«o que tem no carrinho?»artigos, totais, moeda
<script>
document.addEventListener('agent-command', (event) => {
const { type, respond } = event.detail;

if (type === 'page_context') {
event.preventDefault();
respond({ path: location.pathname, title: document.title });
}
});
</script>

Depois de preventDefault() tem cerca de um segundo para responder: um await serve, uma chamada lenta a uma API não. Responda com o que já tem à mão.


O que o agente pode e não pode pedir

  • Apenas caminhos do seu próprio site. O caminho tem de começar por /. Tudo o que pudesse sair do seu domínio — //evil.com, https://…, barras invertidas — é recusado antes de chegar à sua página. Um agente não pode enviar os seus visitantes para outro lado.
  • Apenas chamadas pelo navegador. Numa chamada telefónica não há página para abrir, por isso ali estes comandos não existem.
  • Uma recusa basta. Se a sua página não confirmar o primeiro pedido, o agente deixa de perguntar durante o resto da chamada. Não volta a tentar e — mais importante — não diz ao visitante que abriu algo que não abriu.
Não acontece nada?

Registe cada comando antes de o filtrar: document.addEventListener('agent-command', e => console.log(e.detail)). Se vir navigate na consola, o agente fez a parte dele e o que falta é o preventDefault() ou o seu handler. Se não vir nada, nunca disseram ao agente que esse caminho existe — volte ao passo 1.


Requisitos Técnicos

Os widgets requerem que o browser do visitante suporte:

  • WebGL 2.0 — para renderização
  • Web Audio API — para processamento de áudio
  • WebRTC — para comunicação de voz em tempo real

Todos os browsers modernos (Chrome, Firefox, Safari, Edge) suportam estas tecnologias.


Restrições de Domínio

Controle que sites podem incorporar o widget do seu agente.

Domínios Sempre Permitidos

Os seguintes domínios são sempre permitidos independentemente da configuração:

  • hanc.ai (e subdomínios)
  • hanc.me (e subdomínios)
  • localhost

Permitir Todos os Domínios

Por padrão, o seu widget pode ser incorporado em qualquer site. Ative "Allow all domains" nas definições de widget para restringir isto.

Restringir a Domínios Específicos

Quando restringido, adicione cada domínio que deve ser permitido:

  • Introduza os nomes de domínio sem https:// (ex.: example.com)
  • Os subdomínios precisam de entradas separadas (ex.: www.example.com, shop.example.com)
  • As portas podem ser especificadas (ex.: localhost:3000)
  • No máximo 50 domínios podem ser autorizados
Segurança

Para agentes em produção, restrinja os widgets aos seus próprios domínios para prevenir incorporação não autorizada.


Termos e Condições

Ative um diálogo de consentimento antes de os interlocutores poderem iniciar uma conversa.

Configuração

DefiniçãoDescrição
Enable TermsToggle do diálogo de termos on/off
Terms ContentTexto de consentimento formatado em Markdown mostrado aos utilizadores (máx. 5.000 caracteres)
Terms URLLink para a sua página completa de Termos e Condições
Privacy URLLink para a sua página de Política de Privacidade

Quando ativado:

  • Os utilizadores veem um diálogo de consentimento antes de iniciar uma chamada
  • Têm de clicar em "Agree" para prosseguir
  • O consentimento é armazenado localmente no browser
  • O botão Reset Consent limpa o consentimento armazenado para testes

Formatação de Conteúdo

O conteúdo dos termos suporta formatação Markdown:

  • Use #### para cabeçalhos
  • Use **bold** para ênfase
  • Use quebras de linha para legibilidade

Relacionados