Під час вебдзвінка (віджет, розміщена сторінка, ваш застосунок) абонент бачить чат поруч із голосом, тож агент може не лише говорити. В абонентів, що телефонують, цього немає.
Увімкніть Агент → Інструменти → Надіслати абоненту (send_to_caller в API агента), і агент зможе виводити на екран абонента до п'яти карток одночасно: заголовок, рядок під ним, опис, зображення, посилання та до двох кнопок відповіді в кожній; він також може запропонувати до трьох швидких відповідей під запитанням. Посилання ніколи не зачитуються вголос.
Агент може надсилати лише ті посилання й зображення, що були йому надані в цьому дзвінку: його інструкції та привітання, база знань (документ, прочитаний з вебсторінки, має її адресу), відповіді ваших функцій і готові картки. Крім того, посилання має вести на один з allowed_hosts (власний сайт готової картки дозволений завжди). Посилання, які агент вигадав або які абонент продиктував уголос, не надсилаються. Посилання на ці сайти в словах агента клікабельні в чаті.
"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": "" }
]
}
Кожне надсилання приходить вам як вебхук call.message_sent (channel, items із title та url, quickReplies, blocked). За дзвінок надсилання відбувається не більше ніж 10 разів.
Під час дзвінка абонент може також вводити текст (адресу електронної пошти, номер замовлення) або натискати кнопку відповіді; агент відповідає на це як на мовлення, попередньо замовкнувши, якщо говорив. До 500 символів у повідомленні, одне на секунду, 100 за дзвінок. У записі дзвінка такі репліки позначено як набрані або обрані натисканням.
Відвідувачі можуть і одразу почати листування замість розмови: віджет і розміщена сторінка пропонують обидва способи або лише один, якщо ви оберете це в Agent → Deploy. У листуванні немає голосу, і воно оплачується за кожне повідомлення. Щоб листуватися з агентом зі свого сервера, використовуйте Chat API.
Віджет надає вашій сторінці об'єкт evasay. Усе необов'язкове, а кадр дзвінка слухає вашу сторінку, лише якщо вона входить до дозволених сайтів віджета (Агент → Розгортання):
<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. Вона виконується від імені відвідувача, як його власний клік: запитуйте підтвердження на своїй сторінці перед усім, що коштує грошей або є незворотним. Посилання з її відповіді можуть надсилатися як картки.Установіть Хто може почати дзвінок на Лише з токеном і нехай ваш сервер отримує одноразовий токен для користувача, що увійшов:
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 (слаг) і web_call_url. Передайте токен сторінці через data-token-url="/your/endpoint" у скрипті віджета (він надсилає туди POST із куками відвідувача й читає { "token": "…" }) або через agent.setToken(async () => token). variables токена перевірені: їх можуть використовувати інструкції, початковий запит і шаблони ваших функцій, як і user_id, який дзвінок зберігає (userId у дзвінку, user_id для фільтрації дзвінків). Зберігайте свій API-ключ на сервері.
У власному застосунку надішліть POST { "token": "…", "pageTools": ["add_to_cart"] } на https://evasay.com + web_call_url. У відповіді — з'єднання дзвінка (адреса WebRTC-пропозиції або адреса WebSocket із токеном дзвінка) для клієнта RTVI, наприклад клієнтського 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.