Em uma chamada web (o widget, a página hospedada, seu app), quem liga vê um chat ao lado da voz, de modo que o agente pode fazer mais do que falar. Quem liga por telefone não tem nada disso.
Ative Agente → Ferramentas → Enviar para quem liga (send_to_caller na API de agentes) e o agente poderá colocar até cinco cartões por vez na tela de quem liga: um título, uma linha abaixo, uma descrição, uma imagem, um link e até dois botões de resposta em cada um; ele também pode oferecer até três respostas rápidas sob uma pergunta. Os links nunca são lidos em voz alta.
O agente só pode enviar links e imagens que recebeu naquela chamada: suas instruções e saudação, a base de conhecimento (um documento lido de uma página web carrega o endereço dela), as respostas das suas funções e os cartões prontos. Além disso, um link precisa estar em um dos allowed_hosts (o próprio site de um cartão pronto sempre está). Links que o agente inventa, ou que quem liga dita em voz alta, não são enviados. Links para esses sites nas palavras do agente podem ser clicados no chat.
"send_to_caller": {
"enabled": true,
"allowed_hosts": ["shop.example.com", "*.cdn.example.com"],
"presets": [
{ "name": "hours", "when": "asked when we open", "title": "Opening hours",
"description": "Mon–Sat 9:00–18:00", "url": "https://shop.example.com/stores", "image_url": "" }
]
}
Cada envio chega a você como o webhook call.message_sent (channel, items com title e url, quickReplies, blocked). Uma chamada envia no máximo 10 vezes.
Durante a chamada, quem liga também pode digitar (um endereço de e-mail, um número de pedido) ou tocar em um botão de resposta; o agente responde como se fosse fala, parando antes se estiver falando. Até 500 caracteres por mensagem, uma por segundo, 100 por chamada. No registro da chamada, esses turnos são marcados como digitados ou tocados.
Os visitantes também podem começar digitando em vez de falar: o widget e a página hospedada oferecem as duas formas, ou só uma delas se você escolher isso em Agent → Deploy. Uma conversa digitada não tem voz e é cobrada por mensagem. Para conversar com um agente a partir do seu próprio servidor, use a Chat API.
O widget dá à sua página um objeto evasay. Tudo é opcional, e o quadro da chamada só escuta a sua página se ela for um dos sites permitidos do widget (Agente → Implantar):
<script src="https://evasay.com/voice-widget.js" data-agent="AGENT_SLUG" async></script>
<script>
window.evasay = window.evasay || [];
evasay.push(function (agent) {
agent.setVariables({ plan: 'pro', page: location.pathname }); // for the next call
agent.update('Cart: 2 items, $120', { key: 'cart' }); // during it
agent.registerTool('add_to_cart', async function (args) {
// your code, in the visitor's browser
return { ok: true, checkout: 'https://shop.example.com/checkout' };
});
agent.on('cards', function (cards) {}); // also 'live', 'ended'
});
</script>
setVariables preenchem {{name}} nas instruções e na saudação. Vêm do navegador do visitante, então o agente é avisado de que não são verificados, e nunca chegam às suas funções nem à consulta de início.update informa ao agente o que acontece na página sem fazê-lo responder; uma atualização mais nova com a mesma key substitui a anterior."kind": "page", sem url) e registre na sua página uma função com o mesmo nome. O agente só pode chamá-la em chamadas de uma página que a registrou; ele espera até timeout_sec (1–10, padrão 5) pela resposta, a menos que wait_for_result seja false. Ela roda com a sessão do visitante, como um clique dele: peça confirmação na sua própria página antes de qualquer coisa que custe dinheiro ou não possa ser desfeita. Links na resposta podem ser enviados como cartões.Defina Quem pode iniciar uma chamada como Somente com token, e faça seu servidor obter um token de uso único para o usuário conectado:
curl https://evasay.com/api/v1/voice/web-calls \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "AGENT_ID", "user_id": "u_42", "variables": { "name": "Ann" }, "expires_in": 600 }'
A resposta traz token (uma chamada, dentro de expires_in segundos, 30–3600, padrão 600), agent (o slug) e web_call_url. Entregue o token à página com data-token-url="/your/endpoint" no script do widget (ele faz um POST ali com os cookies do visitante e lê { "token": "…" }) ou com agent.setToken(async () => token). As variables do token são verificadas: as instruções, a consulta de início e os modelos das suas funções podem usá-las, assim como user_id, que a chamada guarda (userId na chamada, user_id para filtrar chamadas). Mantenha sua chave de API no seu servidor.
No seu próprio app, faça POST de { "token": "…", "pageTools": ["add_to_cart"] } para https://evasay.com + web_call_url. A resposta é a conexão da chamada (um endereço de oferta WebRTC, ou um endereço WebSocket, com seu token de chamada), para um cliente RTVI como o SDK de cliente do Pipecat; para iOS, Android e React Native veja Apps para celular. Cartões, funções de página e avisos chegam como server-message do RTVI (evasay.cards, evasay.tool, evasay.notice); envie as palavras digitadas com send-text e os relatos e respostas da página como client-message evasay.context e evasay.tool_result. Ou transporte você mesmo o áudio com Áudio por WebSocket, passando user_id e page_tools.