Bij een webgesprek (de widget, de gehoste pagina, je app) ziet de beller een chat naast de stem, zodat de agent meer kan doen dan spreken. Bellers per telefoon hebben dit niet.
Zet Agent → Tools → Naar de beller sturen aan (send_to_caller in de agent-API) en de agent kan tot vijf kaarten tegelijk op het scherm van de beller zetten: een titel, een regel eronder, een beschrijving, een afbeelding, een link en elk tot twee antwoordknoppen; hij kan ook tot drie snelle antwoorden onder een vraag aanbieden. Links worden nooit voorgelezen.
De agent mag alleen links en afbeeldingen sturen die hij in dat gesprek heeft gekregen: zijn instructies en begroeting, de kennisbank (een document dat van een webpagina is gelezen draagt het adres daarvan), de antwoorden van je functies en de kant-en-klare kaarten. Een link moet bovendien op een van de allowed_hosts staan (de eigen site van een kant-en-klare kaart altijd). Links die de agent verzint, of die de beller voorleest, worden niet verstuurd. Links naar die websites in de woorden van de agent zijn in de chat aanklikbaar.
"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": "" }
]
}
Elke verzending krijg je als de call.message_sent-webhook (channel, items met title en url, quickReplies, blocked). Een gesprek verstuurt maximaal 10 keer.
Tijdens het gesprek kan de beller ook typen (een e-mailadres, een bestelnummer) of op een antwoordknop tikken; de agent antwoordt erop als op spraak en stopt eerst als hij aan het woord was. Tot 500 tekens per bericht, één per seconde, 100 per gesprek. In het gespreksverslag zijn deze beurten gemarkeerd als getypt of aangetikt.
Bezoekers kunnen ook beginnen met typen in plaats van praten: de widget en de gehoste pagina bieden allebei, of maar één van de twee als je dat kiest bij Agent → Deploy. Een getypt gesprek heeft geen stem en wordt per bericht gerekend. Gebruik de Chat API om vanaf je eigen server met een agent te chatten.
De widget geeft je pagina een evasay-object. Alles is optioneel, en het gespreksframe luistert alleen naar je pagina als die een van de toegestane websites van de widget is (Agent → Implementeren):
<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 vullen {{name}} in de instructies en de begroeting. Ze komen uit de browser van de bezoeker, dus de agent krijgt te horen dat ze niet geverifieerd zijn, en ze bereiken nooit je functies of de startopzoeking.update vertelt de agent wat er op de pagina gebeurt zonder dat hij hoeft te antwoorden; een nieuwere update met dezelfde key vervangt de oudere."kind": "page", geen url) aan de agent toe en registreer op je pagina een functie met dezelfde naam. De agent mag haar alleen aanroepen bij gesprekken vanaf een pagina die haar heeft geregistreerd; hij wacht tot timeout_sec (1–10, standaard 5) op het antwoord, tenzij wait_for_result false is. Ze draait ingelogd als de bezoeker, als een klik van hen: vraag op je eigen pagina om bevestiging vóór alles wat geld kost of niet ongedaan te maken is. Links in het antwoord mogen als kaarten worden verstuurd.Zet Wie een gesprek kan starten op Alleen met een token en laat je server een eenmalig token ophalen voor de ingelogde gebruiker:
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 }'
Het antwoord bevat token (één gesprek, binnen expires_in seconden, 30–3600, standaard 600), agent (de slug) en web_call_url. Geef het token aan de pagina met data-token-url="/your/endpoint" op het script van de widget (hij doet daar een POST met de cookies van de bezoeker en leest { "token": "…" }) of met agent.setToken(async () => token). De variables van het token zijn geverifieerd: de instructies, de startopzoeking en de sjablonen van je functies mogen ze gebruiken, evenals user_id, dat het gesprek bewaart (userId in het gesprek, user_id om gesprekken te filteren). Houd je API-sleutel op je server.
Doe in je eigen app een POST met { "token": "…", "pageTools": ["add_to_cart"] } naar https://evasay.com + web_call_url. Het antwoord is de verbinding van het gesprek (een WebRTC-offeradres, of een WebSocket-adres, met zijn gesprekstoken), voor een RTVI-client zoals de client-SDK van Pipecat; voor iOS, Android en React Native zie Mobiele apps. Kaarten, paginafuncties en meldingen komen binnen als RTVI-server-messages (evasay.cards, evasay.tool, evasay.notice); stuur getypte woorden met send-text en meldingen en antwoorden van de pagina als client-messages evasay.context en evasay.tool_result. Of vervoer de audio zelf met Audio via een WebSocket, met user_id en page_tools erbij.