mock (для розробки, без мережі), plivo (Voice API + передавання XML +
розпізнавання мовлення GetInput), telnyx (Call Control v2), twilio (Programmable Voice +
Media Streams).
Plugin голосових викликів працює всередині процесу Gateway. Якщо ви використовуєте
віддалений Gateway, установіть і налаштуйте Plugin на машині, де працює
Gateway, а потім перезапустіть Gateway, щоб завантажити його.
Швидкий початок
1
Установіть Plugin
- З npm
- З локальної папки (для розробки)
2
Налаштуйте провайдера та Webhook
Установіть конфігурацію в
plugins.entries.voice-call.config (див.
Конфігурація нижче). Щонайменше потрібні: provider, облікові дані
провайдера, fromNumber і загальнодоступна URL-адреса Webhook.3
Перевірте налаштування
streaming або realtime).4
Виконайте базову перевірку
--yes, щоб здійснити короткий вихідний
виклик-сповіщення:Конфігурація
Якщо встановленоenabled: true, але для вибраного провайдера відсутні облікові дані, під час запуску Gateway
до журналу записується попередження про незавершене налаштування із зазначенням відсутніх ключів, а
середовище виконання не запускається. Команди, виклики RPC та інструменти агента однаково повертають
точний перелік відсутніх параметрів конфігурації під час використання.
Облікові дані голосових викликів підтримують SecretRefs.
plugins.entries.voice-call.config.twilio.authToken, plugins.entries.voice-call.config.realtime.providers.*.apiKey, plugins.entries.voice-call.config.streaming.providers.*.apiKey і plugins.entries.voice-call.config.tts.providers.*.apiKey розпізнаються через стандартний інтерфейс SecretRef; див. Інтерфейс облікових даних SecretRef.Довідник із конфігурації
Ключі верхнього рівня вplugins.entries.voice-call.config, не наведені вище:
За замовчуванням Twilio використовує свою кінцеву точку REST у US1. Щоб обробляти виклики в підтримуваному
регіоні за межами США, установіть
twilio.region у значення ie1 або au1 і використовуйте облікові дані з
цього регіону. Див.
Посібник Twilio щодо REST API в регіоні за межами США.
Примітки щодо доступності й безпеки провайдерів
Примітки щодо доступності й безпеки провайдерів
- Для Twilio, Telnyx і Plivo потрібна загальнодоступна URL-адреса Webhook.
mock— локальний провайдер для розробки (без мережевих викликів).- Для Telnyx потрібен
telnyx.publicKey(абоTELNYX_PUBLIC_KEY), якщоskipSignatureVerificationне має значення true. skipSignatureVerificationпризначено лише для локального тестування.- На безплатному тарифі ngrok установіть
publicUrlу точну URL-адресу ngrok; перевірка підпису завжди обов’язкова. tunnel.allowNgrokFreeTierLoopbackBypass: trueдозволяє Webhook Twilio з недійсними підписами лише тоді, колиtunnel.provider="ngrok", аserve.bindє local loopback (локальний агент ngrok). Лише для локальної розробки.- URL-адреси безплатного тарифу ngrok можуть змінюватися або додавати проміжні сторінки; якщо
publicUrlзміниться, перевірка підписів Twilio завершуватиметься помилкою. Для виробничого середовища надавайте перевагу стабільному домену або Tailscale funnel.
Обмеження потокових з’єднань
Обмеження потокових з’єднань
streaming.preStartTimeoutMs(за замовчуванням5000) закриває сокети, які так і не надіслали дійсний кадрstart.streaming.maxPendingConnections(за замовчуванням32) обмежує загальну кількість неавтентифікованих сокетів до запуску.streaming.maxPendingConnectionsPerIp(за замовчуванням4) обмежує кількість неавтентифікованих сокетів до запуску для кожної вихідної IP-адреси.streaming.maxConnections(за замовчуванням128) обмежує всі відкриті сокети медіапотоків (очікувані + активні).
Міграції застарілої конфігурації
Міграції застарілої конфігурації
Під час розбору конфігурації ці застарілі ключі автоматично нормалізуються, а до журналу
записується попередження із зазначенням нового шляху; цей адаптер буде видалено в майбутньому
випуску (
2026.6.0), тому виконайте openclaw doctor --fix, щоб перезаписати збережену
конфігурацію в канонічному форматі:provider: "log"→provider: "mock"twilio.from→fromNumberstreaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThresholdrealtime.agentContext.includeSystemPromptвидалено (контекст реального часу тепер використовує згенерований запит агента)
Область сеансу
За замовчуванням Voice Call використовуєsessionScope: "per-phone", щоб повторні виклики від
того самого абонента зберігали пам’ять розмови. Установіть sessionScope: "per-call", коли
кожен виклик через оператора має починатися з нового контексту, наприклад для рецепції,
бронювання, IVR або потоків мосту Google Meet, де той самий номер телефону може
представляти різні зустрічі.
Voice Call зберігає згенеровані ключі сеансів у налаштованому просторі імен агента
(agent:<agentId>:voice:*). Явно задані необроблені ключі інтеграції розпізнаються в
тому самому просторі імен: канонічний ключ agent:<configuredAgentId>:* зберігає цього
власника та враховує псевдоніми session.mainKey/глобальної області ядра; сторонні або
неправильно сформовані вхідні значення agent:* обробляються як непрозорий ключ у просторі налаштованого
агента; global і unknown залишаються глобальними сигнальними значеннями.
Голосові розмови в реальному часі
realtime вибирає провайдера повнодуплексного голосового зв’язку в реальному часі для аудіо виклику.
Він відокремлений від streaming, який лише передає аудіо провайдерам транскрибування
в реальному часі.
Поточна поведінка середовища виконання:
realtime.enabledпідтримується для Twilio і Telnyx.realtime.providerє необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого постачальника голосового зв’язку в реальному часі.- Вбудовані постачальники голосового зв’язку в реальному часі: Google Gemini Live (
google) і OpenAI (openai), зареєстровані відповідними Plugin постачальників. - Необроблена конфігурація, якою керує постачальник, розміщується в
realtime.providers.<providerId>. - За замовчуванням Voice Call надає спільний інструмент реального часу
openclaw_agent_consult. Модель реального часу може викликати його, коли абонент просить про глибший аналіз, актуальну інформацію або звичайні інструменти OpenClaw. realtime.consultPolicyнеобов’язково додає вказівки щодо того, коли модель реального часу має викликатиopenclaw_agent_consult.realtime.agentContext.enabledза замовчуванням вимкнено. Коли цей параметр увімкнено, Voice Call під час налаштування сеансу додає до інструкцій постачальника реального часу обмежений опис ідентичності агента та вибраний набір файлів робочого простору.realtime.fastContext.enabledза замовчуванням вимкнено. Коли цей параметр увімкнено, Voice Call спочатку шукає контекст запитання для консультації в індексованій пам’яті та контексті сеансу й повертає ці фрагменти моделі реального часу протягомrealtime.fastContext.timeoutMs, а до повноцінного агента консультацій переходить лише тоді, колиrealtime.fastContext.fallbackToConsultмає значенняtrue.- Якщо
realtime.providerуказує на незареєстрованого постачальника або жодного постачальника голосового зв’язку в реальному часі взагалі не зареєстровано, Voice Call записує попередження в журнал і пропускає медіа в реальному часі замість завершення роботи всього Plugin з помилкою. inboundPolicyне повинен мати значення"disabled", колиrealtime.enabledмає значенняtrue;validateProviderConfigвідхиляє таке поєднання.- Ключі сеансів консультацій повторно використовують збережений сеанс виклику, якщо він доступний, а потім переходять до налаштованого
sessionScope(за замовчуваннямper-phoneабоper-callдля ізольованих викликів).
Політика інструментів
realtime.toolPolicy керує виконанням консультації:
realtime.consultPolicy керує лише інструкціями моделі реального часу:
Голосовий контекст агента
Увімкнітьrealtime.agentContext, якщо голосовий міст має звучати як
налаштований агент OpenClaw без повного циклу звернення до агента консультацій
під час звичайних реплік. Контекстний набір додається один раз під час створення
сеансу реального часу, тому він не збільшує затримку кожної репліки. Виклики
openclaw_agent_consult усе одно запускають повноцінного агента OpenClaw і мають
використовуватися для роботи з інструментами, отримання актуальної інформації,
пошуку в пам’яті або стану робочого простору.
Приклади постачальників реального часу
- Google Gemini Live
- OpenAI
Значення за замовчуванням: ключ API із
realtime.providers.google.apiKey, GEMINI_API_KEY
або GOOGLE_API_KEY; модель gemini-3.1-flash-live-preview;
голос Kore. sessionResumption і contextWindowCompression за замовчуванням
увімкнено для довших викликів із можливістю повторного підключення. Використовуйте
silenceDurationMs, startSensitivity і endSensitivity, щоб налаштувати швидше
чергування реплік для телефонного аудіо.Потокове транскрибування
streaming вибирає постачальника транскрибування в реальному часі для аудіо виклику наживо.
Поточна поведінка середовища виконання:
streaming.providerє необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого постачальника транскрибування в реальному часі.- Вбудовані постачальники транскрибування в реальному часі: Deepgram (
deepgram), ElevenLabs (elevenlabs), Mistral (mistral), OpenAI (openai) і xAI (xai), зареєстровані відповідними Plugin постачальників. - Необроблена конфігурація, якою керує постачальник, розміщується в
streaming.providers.<providerId>. - Після того як Twilio надсилає прийняте повідомлення
startдля потоку, Voice Call негайно реєструє потік, ставить вхідні медіадані в чергу для обробки постачальником транскрибування, поки той підключається, і запускає початкове привітання лише після готовності транскрибування в реальному часі. - Якщо
streaming.providerуказує на незареєстрованого постачальника або жодного постачальника не зареєстровано, Voice Call записує попередження в журнал і пропускає потокове передавання медіа замість завершення роботи всього Plugin з помилкою.
Приклади постачальників потокового передавання
- OpenAI
- xAI
Значення за замовчуванням: ключ API
streaming.providers.openai.apiKey або
OPENAI_API_KEY; модель gpt-4o-transcribe; silenceDurationMs: 800;
vadThreshold: 0.5.TTS для викликів
Voice Call використовує основну конфігураціюmessages.tts для потокового синтезу мовлення
під час викликів. Її можна перевизначити в конфігурації Plugin за допомогою такої самої структури —
вона рекурсивно об’єднується з messages.tts.
- Застарілі ключі
tts.<provider>у конфігурації Plugin (openai,elevenlabs,microsoft,edge) виправляються командоюopenclaw doctor --fix; зафіксована в репозиторії конфігурація має використовуватиtts.providers.<provider>. - Основний TTS використовується, коли ввімкнено потокове передавання медіа Twilio; інакше виклики переходять до вбудованих голосів постачальника.
- Якщо потік медіа Twilio вже активний, Voice Call не переходить до TwiML
<Say>. Якщо TTS для телефонії в такому стані недоступний, запит на відтворення завершується помилкою замість змішування двох шляхів відтворення. - Коли TTS для телефонії переходить до резервного постачальника, Voice Call записує в журнал попередження з ланцюжком постачальників (
from,to,attempts) для налагодження. - Коли переривання мовлення Twilio або завершення потоку очищає чергу очікування TTS, поставлені в чергу запити на відтворення завершуються, а не залишають абонентів, які очікують завершення відтворення, у завислому стані.
Приклади TTS
- Лише основний TTS
- Перевизначення на ElevenLabs (лише виклики)
- Перевизначення моделі OpenAI (рекурсивне об’єднання)
Вхідні виклики
За замовчуванням політика вхідних викликів має значенняdisabled. Щоб увімкнути вхідні виклики, задайте:
responseModel,
responseSystemPrompt і responseTimeoutMs.
Маршрутизація за номером
Використовуйтеnumbers, коли один Plugin Voice Call приймає виклики на кілька телефонних
номерів і кожен номер має працювати як окрема лінія. Наприклад,
один номер може використовувати невимушеного персонального помічника, а інший — ділову
персону, іншого агента відповідей та інший голос TTS.
Маршрути вибираються за наданим провайдером набраним номером To. Ключами мають
бути номери у форматі E.164. Коли надходить виклик, Voice Call одноразово визначає відповідний
маршрут, зберігає його в записі виклику та повторно використовує цю
ефективну конфігурацію для привітання, класичного шляху автоматичної відповіді, шляху
консультації в реальному часі та відтворення TTS. Якщо жоден маршрут не відповідає,
використовується глобальна конфігурація Voice Call. Вихідні виклики не використовують
numbers; під час ініціювання виклику явно передавайте цільовий номер,
повідомлення та сеанс.
Перевизначення маршрутів наразі підтримують:
inboundGreetingttsagentIdresponseModelresponseSystemPromptresponseTimeoutMs
tts глибоко об’єднується з глобальною конфігурацією tts Voice Call, тому
зазвичай достатньо перевизначити лише голос провайдера:
Контракт голосового виведення
Для автоматичних відповідей Voice Call додає до системного запиту суворий контракт голосового виведення, який вимагає JSON-відповідь{"spoken":"..."}. Voice Call
надійно видобуває текст для озвучення:
- Ігнорує корисні навантаження, позначені як вміст міркувань або помилок.
- Аналізує безпосередній JSON, JSON у блоці коду або вбудовані ключі
"spoken". - У разі невдачі використовує звичайний текст і видаляє ймовірні вступні абзаци з плануванням або метаданими.
Поведінка під час початку розмови
Для вихідних викликівconversation обробка першого повідомлення пов’язана зі станом
відтворення наживо:
- Очищення черги під час перебивання та автоматична відповідь блокуються лише тоді, коли початкове привітання активно озвучується.
- Якщо початкове відтворення завершується помилкою, виклик повертається до стану
listening, а початкове повідомлення залишається в черзі для повторної спроби. - Початкове відтворення для потокового передавання Twilio запускається після підключення потоку без додаткової затримки.
- Перебивання припиняє активне відтворення та очищає записи TTS Twilio, які перебувають у черзі, але ще не відтворюються. Очищені записи завершуються як пропущені, тому логіка наступної відповіді може продовжитися, не очікуючи аудіо, яке ніколи не буде відтворено.
- Голосові розмови в реальному часі використовують власну початкову репліку потоку реального часу. Voice Call не надсилає застаріле оновлення TwiML
<Say>для цього початкового повідомлення, тому вихідні сеанси<Connect><Stream>залишаються підключеними.
Період очікування після відключення потоку Twilio
Коли медіапотік Twilio відключається, Voice Call очікує 2000 мс, перш ніж автоматично завершити виклик:- Якщо потік повторно підключається протягом цього періоду, автоматичне завершення скасовується.
- Якщо після завершення періоду очікування жоден потік не реєструється повторно, виклик завершується, щоб уникнути завислих активних викликів.
Очищення застарілих викликів
ВикористовуйтеstaleCallReaperSeconds (типове значення — 120), щоб завершувати виклики, на які ніколи
не відповіли та які ніколи не досягли стану активної розмови, наприклад виклики в режимі сповіщення,
для яких провайдер ніколи не надсилає завершальний Webhook. Установіть значення 0, щоб
вимкнути цю функцію.
Очищення запускається кожні 30 секунд і завершує лише виклики, які не мають
часової позначки answeredAt і ще не перебувають у завершальному стані або стані активної
розмови (speaking/listening), тому цей таймер ніколи не завершує
розмови, на які відповіли; maxDurationSeconds (типове значення — 300) — це окреме обмеження,
яке завершує виклики, на які відповіли, якщо вони тривають надто довго.
Для сценаріїв зі сповіщеннями, у яких оператори можуть повільно надсилати Webhook
дзвінка або відповіді, збільште staleCallReaperSeconds понад типове значення, щоб повільні, але нормальні
виклики не завершувалися передчасно; 120–300 секунд — доцільний діапазон
для робочого середовища.
Безпека Webhook
Коли перед Gateway розташовано проксі або тунель, Plugin відновлює публічну URL-адресу для перевірки підпису. Ці параметри визначають, яким пересланим заголовкам слід довіряти:string[]
Список дозволених хостів із заголовків пересилання.
boolean
Довіряти пересланим заголовкам без списку дозволених.
string[]
Довіряти пересланим заголовкам лише тоді, коли віддалена IP-адреса запиту відповідає списку.
- Захист від повторного відтворення Webhook увімкнено для Twilio, Telnyx і Plivo. Повторно надіслані дійсні запити Webhook підтверджуються, але їхні побічні дії пропускаються.
- Репліки розмови Twilio містять окремий токен для кожної репліки у зворотних викликах
<Gather>, тому застарілі або повторно відтворені зворотні виклики мовлення не можуть задовольнити новішу очікувану репліку транскрипту. - Неавтентифіковані запити Webhook відхиляються до читання тіла, якщо відсутні обов’язкові заголовки підпису провайдера.
- Webhook voice-call використовує спільний профіль читання тіла до автентифікації (максимальний розмір тіла — 64 КБ, час очікування читання — 5 секунд), а також обмеження кількості активних запитів для кожного ключа (типово 8 одночасних запитів на ключ) до перевірки підпису.
CLI
voicecall
передають виконання середовищу voice-call, яким керує Gateway, щоб CLI не прив’язував
другий сервер Webhook. Якщо Gateway недоступне, команди переходять до
автономного середовища CLI.
latency читає calls.jsonl із типового шляху сховища voice-call. Використовуйте
--file <path>, щоб указати інший журнал, і --last <n>, щоб обмежити
аналіз останніми N записами (типово 200). Виведення містить мінімальне, максимальне й середнє значення,
p50 і p95 для затримки репліки та часу очікування прослуховування.
Інструмент агента
Назва інструмента:voice_call.
Plugin voice-call постачається з відповідним Skills агента.
RPC Gateway
dtmfSequence допустиме лише з mode: "conversation"; виклики в режимі сповіщення,
яким потрібні цифри після підключення, мають використовувати voicecall.dtmf після створення
виклику.
Усунення несправностей
Налаштуванню не вдається опублікувати Webhook
Запускайте налаштування з того самого середовища, у якому працює Gateway:twilio, telnyx і plivo перевірка webhook-exposure має бути успішною. Налаштована
publicUrl усе одно не працюватиме, якщо вказує на локальний або приватний
мережевий простір, оскільки оператор не може виконати зворотний виклик на такі адреси.
Не використовуйте localhost, 127.0.0.1, 0.0.0.0, 10.x, 172.16.x-172.31.x,
192.168.x, 169.254.x, fc00::/7, fd00::/8 або інші діапазони NAT
операторського класу як publicUrl.
Вихідні виклики Twilio в режимі сповіщення надсилають початковий TwiML <Say> безпосередньо
в запиті створення виклику, тому перше озвучене повідомлення не залежить від
отримання Twilio Webhook TwiML. Публічний Webhook усе одно потрібен для зворотних викликів
стану, розмовних викликів, DTMF до підключення, потоків реального часу та
керування викликом після підключення.
Використовуйте один публічний шлях доступу:
voicecall smoke виконується в режимі пробного запуску, якщо не передати --yes.
Помилка облікових даних провайдера
Перевірте вибраного провайдера та обов’язкові поля облікових даних:- Twilio:
twilio.accountSid,twilio.authTokenіfromNumberабоTWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKENіTWILIO_FROM_NUMBER. - Telnyx:
telnyx.apiKey,telnyx.connectionId,telnyx.publicKeyіfromNumberабоTELNYX_API_KEY,TELNYX_CONNECTION_IDіTELNYX_PUBLIC_KEY. - Plivo:
plivo.authId,plivo.authTokenіfromNumberабоPLIVO_AUTH_IDіPLIVO_AUTH_TOKEN.
Виклики починаються, але Webhook постачальника не надходять
Переконайтеся, що в консолі постачальника вказано точну публічну URL-адресу Webhook:publicUrlуказує на шлях, відмінний відserve.path.- URL-адреса тунелю змінилася після запуску Gateway.
- Проксі пересилає запит, але видаляє або переписує заголовки хосту чи протоколу.
- Брандмауер або DNS спрямовує публічне ім’я хосту не на Gateway.
- Gateway було перезапущено без увімкненого Plugin голосових викликів.
webhookSecurity.allowedHosts публічне ім’я хосту або використовуйте
webhookSecurity.trustedProxyIPs для відомої адреси проксі. Використовуйте
webhookSecurity.trustForwardingHeaders, лише якщо межа проксі
перебуває під вашим контролем.
Не вдається перевірити підпис
Підписи постачальника перевіряються щодо публічної URL-адреси, яку OpenClaw відтворює з вхідного запиту. Якщо перевірка підписів не вдається:- Переконайтеся, що URL-адреса Webhook постачальника точно відповідає
publicUrl, включно зі схемою, хостом і шляхом. - Для URL-адрес безплатного рівня ngrok оновлюйте
publicUrl, коли змінюється ім’я хосту тунелю. - Переконайтеся, що проксі зберігає початкові заголовки хосту та протоколу, або налаштуйте
webhookSecurity.allowedHosts. - Не вмикайте
skipSignatureVerificationпоза межами локального тестування.
Не вдається приєднатися до Google Meet через Twilio
Google Meet використовує цей Plugin для приєднання через телефонний набір Twilio. Спочатку перевірте голосові виклики:--dtmf-sequence. Телефонний виклик може працювати
нормально, навіть якщо зустріч відхиляє або ігнорує неправильну послідовність DTMF.
Google Meet запускає телефонне з’єднання Twilio через voicecall.start із
послідовністю DTMF перед підключенням. Послідовності, сформовані з PIN-коду, містять
voiceCall.dtmfDelayMs Plugin Google Meet (типове значення — 12000 мс) як початкові
цифри очікування Twilio, оскільки підказки телефонного підключення Meet можуть надходити із запізненням.
Потім голосовий виклик перенаправляється назад до обробки в реальному часі до запиту
вступного привітання.
Використовуйте openclaw logs --follow для відстеження етапів у реальному часі. Успішне
приєднання Twilio до Meet реєструє події в такому порядку:
- Google Meet делегує приєднання через Twilio голосовому виклику.
- Голосовий виклик зберігає TwiML із DTMF перед підключенням.
- Початковий TwiML Twilio обробляється й надається до обробки в реальному часі.
- Голосовий виклик надає TwiML реального часу для виклику Twilio.
- Google Meet запитує вступне мовлення через
voicecall.speakпісля затримки, що настає після DTMF.
openclaw voicecall tail і далі показує збережені записи викликів; це корисно для
стану викликів і транскрипцій, але не кожен перехід Webhook або режиму реального часу
відображається там.
У виклику в реальному часі немає мовлення
Переконайтеся, що ввімкнено лише один режим аудіо:realtime.enabled і
streaming.enabled не можуть одночасно мати значення true.
Для викликів Twilio/Telnyx у реальному часі також перевірте:
- Plugin постачальника роботи в реальному часі завантажено й зареєстровано.
realtime.providerне задано або він указує на зареєстрованого постачальника.- API-ключ постачальника доступний процесу Gateway.
openclaw logs --followпоказує надання TwiML реального часу, запуск моста реального часу та додавання початкового привітання до черги.