Σε μια web κλήση (το widget, η φιλοξενούμενη σελίδα, η εφαρμογή σας) ο καλών βλέπει ένα chat δίπλα στη φωνή, ώστε ο πράκτορας να μπορεί να κάνει περισσότερα από το να μιλά. Οι καλούντες από τηλέφωνο δεν έχουν τίποτα από αυτά.
Ενεργοποιήστε το Πράκτορας → Εργαλεία → Αποστολή στον καλούντα (send_to_caller στο API πρακτόρων) και ο πράκτορας μπορεί να τοποθετεί έως πέντε κάρτες τη φορά στην οθόνη του καλούντος: έναν τίτλο, μια γραμμή από κάτω, μια περιγραφή, μια εικόνα, έναν σύνδεσμο και έως δύο κουμπιά απάντησης η καθεμία· μπορεί επίσης να προσφέρει έως τρεις γρήγορες απαντήσεις κάτω από μια ερώτηση. Οι σύνδεσμοι δεν διαβάζονται ποτέ φωναχτά.
Ο πράκτορας μπορεί να στέλνει μόνο συνδέσμους και εικόνες που του δόθηκαν σε εκείνη την κλήση: τις οδηγίες και τον χαιρετισμό του, τη βάση γνώσης (ένα έγγραφο που διαβάστηκε από μια ιστοσελίδα φέρει τη διεύθυνσή της), τις απαντήσεις των συναρτήσεών σας και τις έτοιμες κάρτες. Ένας σύνδεσμος πρέπει επίσης να βρίσκεται σε έναν από τους allowed_hosts (ο ίδιος ο ιστότοπος μιας έτοιμης κάρτας είναι πάντα). Σύνδεσμοι που επινοεί ο πράκτορας ή που υπαγορεύει φωναχτά ο καλών δεν στέλνονται. Οι σύνδεσμοι προς αυτούς τους ιστότοπους μέσα στα λόγια του πράκτορα είναι κλικαριστοί στο 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": "" }
]
}
Κάθε αποστολή φτάνει σε εσάς ως το webhook call.message_sent (channel, items με title και url, quickReplies, blocked). Μια κλήση στέλνει το πολύ 10 φορές.
Κατά τη διάρκεια της κλήσης ο καλών μπορεί επίσης να πληκτρολογήσει (μια διεύθυνση email, έναν αριθμό παραγγελίας) ή να αγγίξει ένα κουμπί απάντησης· ο πράκτορας απαντά όπως σε ομιλία, σταματώντας πρώτα αν μιλούσε. Έως 500 χαρακτήρες ανά μήνυμα, ένα το δευτερόλεπτο, 100 ανά κλήση. Στο αρχείο της κλήσης αυτοί οι γύροι σημειώνονται ως πληκτρολογημένοι ή αγγιγμένοι.
Οι επισκέπτες μπορούν επίσης να ξεκινήσουν γράφοντας αντί να μιλήσουν: το widget και η φιλοξενούμενη σελίδα προσφέρουν και τα δύο, ή μόνο το ένα αν το επιλέξετε στο Agent → Deploy. Μια γραπτή συνομιλία δεν έχει φωνή και χρεώνεται ανά μήνυμα. Για να συνομιλήσετε με έναν agent από τον δικό σας διακομιστή, χρησιμοποιήστε το Chat API.
Το widget δίνει στη σελίδα σας ένα αντικείμενο evasay. Όλα είναι προαιρετικά, και το πλαίσιο της κλήσης ακούει τη σελίδα σας μόνο αν είναι ένας από τους επιτρεπόμενους ιστότοπους του widget (Πράκτορας → Ανάπτυξη):
<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 συμπληρώνουν το {{name}} στις οδηγίες και τον χαιρετισμό. Προέρχονται από το πρόγραμμα περιήγησης του επισκέπτη, οπότε ο πράκτορας ενημερώνεται ότι δεν είναι επαληθευμένες, και δεν φτάνουν ποτέ στις συναρτήσεις σας ούτε στην αναζήτηση έναρξης.update ενημερώνει τον πράκτορα για ό,τι συμβαίνει στη σελίδα χωρίς να τον κάνει να απαντήσει· μια νεότερη ενημέρωση με το ίδιο key αντικαθιστά την παλαιότερη."kind": "page", χωρίς url) και καταχωρίστε στη σελίδα σας μια συνάρτηση με το ίδιο όνομα. Ο πράκτορας μπορεί να την καλέσει μόνο σε κλήσεις από σελίδα που την έχει καταχωρίσει· περιμένει την απάντηση έως timeout_sec (1–10, προεπιλογή 5), εκτός αν το wait_for_result είναι false. Εκτελείται με τη σύνδεση του επισκέπτη, σαν δικό του κλικ: ζητήστε επιβεβαίωση στη δική σας σελίδα πριν από οτιδήποτε κοστίζει χρήματα ή δεν αναιρείται. Σύνδεσμοι στην απάντησή της μπορούν να σταλούν ως κάρτες.Ορίστε το Ποιος μπορεί να ξεκινήσει κλήση σε Μόνο με token και ζητήστε από τον διακομιστή σας ένα token μίας χρήσης για τον συνδεδεμένο χρήστη:
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 }'
Η απάντηση περιέχει token (μία κλήση, μέσα σε expires_in δευτερόλεπτα, 30–3600, προεπιλογή 600), agent (το slug) και web_call_url. Δώστε το token στη σελίδα με data-token-url="/your/endpoint" στο script του widget (κάνει εκεί POST με τα cookies του επισκέπτη και διαβάζει { "token": "…" }) ή με agent.setToken(async () => token). Τα variables του token είναι επαληθευμένα: οι οδηγίες, η αναζήτηση έναρξης και τα πρότυπα των συναρτήσεών σας μπορούν να τα χρησιμοποιούν, όπως και το user_id, που η κλήση διατηρεί (userId στην κλήση, user_id για φιλτράρισμα κλήσεων). Κρατήστε το κλειδί API σας στον διακομιστή σας.
Στη δική σας εφαρμογή, κάντε POST { "token": "…", "pageTools": ["add_to_cart"] } στο https://evasay.com + web_call_url. Η απάντηση είναι η σύνδεση της κλήσης (μια διεύθυνση προσφοράς WebRTC ή μια διεύθυνση WebSocket, με το token κλήσης της), για έναν πελάτη RTVI όπως το client SDK του Pipecat· για iOS, Android και React Native δείτε Εφαρμογές για κινητά. Οι κάρτες, οι συναρτήσεις σελίδας και οι ειδοποιήσεις φτάνουν ως RTVI server-message (evasay.cards, evasay.tool, evasay.notice)· στείλτε πληκτρολογημένες λέξεις με send-text και αναφορές και απαντήσεις της σελίδας ως client-message evasay.context και evasay.tool_result. Ή μεταφέρετε μόνοι σας τον ήχο με Ήχος μέσω WebSocket, περνώντας user_id και page_tools.