Bei einem Web-Anruf (Widget, gehostete Seite, Ihre App) sieht der Anrufer neben der Stimme einen Chat, sodass der Agent mehr kann als sprechen. Telefonanrufer bekommen nichts davon.
Aktivieren Sie Agent → Wissen & Tools → An den Anrufer senden (send_to_caller in der Agent-API), und der Agent kann bis zu fünf Karten gleichzeitig auf dem Bildschirm des Anrufers zeigen: je einen Titel, eine Zeile darunter, eine Beschreibung, ein Bild, einen Link und bis zu zwei Antwort-Buttons; er kann auch bis zu drei Schnellantworten unter einer Frage anbieten. Links werden nie vorgelesen.
Der Agent darf nur Links und Bilder senden, die er in diesem Anruf bekommen hat: aus seinen Anweisungen und seiner Begrüßung, der Wissensdatenbank (ein von einer Webseite gelesenes Dokument trägt deren Adresse), den Antworten Ihrer Funktionen und den vorgefertigten Karten. Ein Link muss außerdem auf einem der allowed_hosts liegen (die Website einer vorgefertigten Karte ist es immer). Links, die der Agent erfindet oder die der Anrufer vorliest, werden nicht gesendet. Links auf diesen Websites in den Worten des Agents sind im Chat anklickbar.
"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": "" }
]
}
Jede Sendung erhalten Sie als Webhook call.message_sent (channel, items mit title und url, quickReplies, blocked). Ein Anruf sendet höchstens 10 Mal.
Während des Anrufs kann der Anrufer auch tippen (eine E-Mail-Adresse, eine Bestellnummer) oder einen Antwort-Button antippen; der Agent antwortet darauf wie auf Gesprochenes und hört zuerst auf, falls er gerade spricht. Bis zu 500 Zeichen pro Nachricht, eine pro Sekunde, 100 pro Anruf. Im Anrufprotokoll sind diese Wechsel als getippt oder angetippt markiert.
Besucher können auch tippen, statt zu sprechen: Widget und gehostete Seite bieten beides an, oder nur eines davon, wenn Sie das unter Agent → Deploy so einstellen. Eine getippte Unterhaltung hat keine Stimme und wird pro Nachricht abgerechnet. Um von Ihrem eigenen Server aus mit einem Agenten zu chatten, nutzen Sie die Chat API.
Das Widget gibt Ihrer Seite ein evasay-Objekt. Alles ist optional, und der Anrufrahmen hört nur auf Ihre Seite, wenn sie eine der erlaubten Websites des Widgets ist (Agent → Bereitstellen):
<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 }); // für den nächsten Anruf
agent.update('Cart: 2 items, $120', { key: 'cart' }); // während des Anrufs
agent.registerTool('add_to_cart', async function (args) {
// Ihr Code, im Browser des Besuchers
return { ok: true, checkout: 'https://shop.example.com/checkout' };
});
agent.on('cards', function (cards) {}); // auch 'live', 'ended'
});
</script>
setVariables-Werte füllen {{name}} in Anweisungen und Begrüßung. Sie kommen aus dem Browser des Besuchers, daher wird dem Agent gesagt, dass sie nicht geprüft sind, und sie erreichen nie Ihre Funktionen oder die Startabfrage.update sagt dem Agent, was auf der Seite passiert, ohne ihn antworten zu lassen; ein neueres Update mit demselben key ersetzt das ältere."kind": "page", keine url) hinzu und registrieren Sie auf Ihrer Seite eine Funktion mit demselben Namen. Der Agent darf sie nur bei Anrufen von einer Seite aufrufen, die sie registriert hat; er wartet bis zu timeout_sec (1–10, Standard 5) auf die Antwort, außer wait_for_result ist false. Sie läuft angemeldet als der Besucher, wie ein Klick von ihm: Fragen Sie auf Ihrer eigenen Seite nach einer Bestätigung, bevor etwas Geld kostet oder nicht rückgängig zu machen ist. Links in ihrer Antwort können als Karten gesendet werden.Stellen Sie Wer einen Anruf starten kann auf Nur mit Token, und lassen Sie Ihren Server ein Einmal-Token für den angemeldeten Nutzer holen:
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 }'
Die Antwort enthält token (ein Anruf innerhalb von expires_in Sekunden, 30–3600, Standard 600), agent (der Slug) und web_call_url. Geben Sie das Token der Seite mit data-token-url="/your/endpoint" am Skript des Widgets (es sendet dort einen POST mit den Cookies des Besuchers und liest { "token": "…" }) oder mit agent.setToken(async () => token). Die variables des Tokens sind geprüft: Anweisungen, Startabfrage und die Vorlagen Ihrer Funktionen dürfen sie nutzen, ebenso user_id, das der Anruf behält (userId im Anruf, user_id zum Filtern von Anrufen). Behalten Sie Ihren API-Schlüssel auf Ihrem Server.
In Ihrer eigenen App senden Sie { "token": "…", "pageTools": ["add_to_cart"] } per POST an https://evasay.com + web_call_url. Die Antwort ist die Verbindung des Anrufs (eine WebRTC-Offer-Adresse oder eine WebSocket-Adresse mit ihrem Anruf-Token) für einen RTVI-Client wie das Client-SDK von Pipecat; für iOS, Android und React Native siehe Mobile Apps. Karten, Seitenfunktionen und Hinweise kommen als RTVI-server-messages (evasay.cards, evasay.tool, evasay.notice); senden Sie getippte Worte mit send-text und Seitenmeldungen und Antworten als client-messages evasay.context und evasay.tool_result. Oder übertragen Sie das Audio selbst mit Audio über einen WebSocket und übergeben Sie user_id und page_tools.