Voice Call (плагін)
Голосові дзвінки для OpenClaw через плагін. Підтримує вихідні сповіщення та багатоходові розмови з політиками для вхідних дзвінків. Поточні провайдери:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + XML transfer + GetInput speech)mock(розробка/без мережі)
- Установіть плагін
- Перезапустіть Gateway
- Налаштуйте в
plugins.entries.voice-call.config - Використовуйте
openclaw voicecall ...або інструментvoice_call
Де це працює (локально чи віддалено)
Плагін Voice Call працює усередині процесу Gateway. Якщо ви використовуєте віддалений Gateway, установіть/налаштуйте плагін на машині, де працює Gateway, а потім перезапустіть Gateway, щоб завантажити його.Установлення
Варіант A: установлення з npm (рекомендовано)
Варіант B: установлення з локальної папки (розробка, без копіювання)
Конфігурація
Задайте конфігурацію вplugins.entries.voice-call.config:
- Для Twilio/Telnyx потрібен публічно доступний URL webhook.
- Для Plivo потрібен публічно доступний URL webhook.
mock— це локальний провайдер для розробки (без мережевих викликів).- Якщо у старих конфігураціях досі використовується
provider: "log",twilio.fromабо застарілі ключі OpenAI вstreaming.*, запустітьopenclaw doctor --fix, щоб переписати їх. - Для Telnyx потрібен
telnyx.publicKey(абоTELNYX_PUBLIC_KEY), якщо тількиskipSignatureVerificationне має значення true. skipSignatureVerificationпризначено лише для локального тестування.- Якщо ви використовуєте безкоштовний рівень ngrok, установіть
publicUrlна точний URL ngrok; перевірка підпису завжди примусово виконується. tunnel.allowNgrokFreeTierLoopbackBypass: trueдозволяє webhook-виклики Twilio з невалідними підписами лише колиtunnel.provider="ngrok"іserve.bind— це loopback (локальний агент ngrok). Використовуйте лише для локальної розробки.- URL-адреси ngrok на безкоштовному рівні можуть змінюватися або додавати проміжну поведінку; якщо
publicUrlзміниться, підписи Twilio перестануть проходити перевірку. Для production краще використовувати стабільний домен або Tailscale funnel. - Типові параметри безпеки streaming:
streaming.preStartTimeoutMsзакриває сокети, які так і не надсилають валідний кадрstart.
streaming.maxPendingConnectionsобмежує загальну кількість неавтентифікованих сокетів до старту.streaming.maxPendingConnectionsPerIpобмежує кількість неавтентифікованих сокетів до старту для кожної IP-адреси джерела.streaming.maxConnectionsобмежує загальну кількість відкритих сокетів медіапотоку (очікування + активні).- Runtime fallback поки що все ще приймає ці старі ключі voice-call, але шлях переписування — це
openclaw doctor --fix, а shim сумісності є тимчасовим.
Транскрибування потоку
streaming вибирає провайдера транскрибування в реальному часі для аудіо живого дзвінка.
Поточна поведінка runtime:
streaming.providerє необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера транскрибування в реальному часі.- Наразі bundled-провайдером є OpenAI, зареєстрований bundled-плагіном
openai. - Сирий конфіг провайдера зберігається в
streaming.providers.<providerId>. - Якщо
streaming.providerвказує на незареєстрованого провайдера або якщо взагалі не зареєстровано жодного провайдера транскрибування в реальному часі, Voice Call записує попередження в журнал і пропускає потокову передачу медіа замість того, щоб аварійно завершити весь плагін.
- API-ключ:
streaming.providers.openai.apiKeyабоOPENAI_API_KEY - модель:
gpt-4o-transcribe silenceDurationMs:800vadThreshold:0.5
openclaw doctor --fix:
streaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThreshold
Очищення застарілих дзвінків
ВикористовуйтеstaleCallReaperSeconds, щоб завершувати дзвінки, які ніколи не отримують термінальний webhook
(наприклад, дзвінки в режимі notify, які так і не завершуються). Типове значення — 0
(вимкнено).
Рекомендовані діапазони:
- Production:
120–300секунд для потоків у стилі notify. - Зберігайте це значення більшим за
maxDurationSeconds, щоб звичайні дзвінки могли завершитися. Хороша початкова точка —maxDurationSeconds + 30–60секунд.
Безпека webhook
Коли перед Gateway стоїть проксі або тунель, плагін реконструює публічний URL для перевірки підпису. Ці параметри керують тим, яким пересланим заголовкам довіряти.webhookSecurity.allowedHosts задає allowlist хостів із пересланих заголовків.
webhookSecurity.trustForwardingHeaders дає змогу довіряти пересланим заголовкам без allowlist.
webhookSecurity.trustedProxyIPs дає змогу довіряти пересланим заголовкам лише тоді, коли
віддалена IP-адреса запиту збігається зі списком.
Захист від повторного відтворення webhook увімкнено для Twilio і Plivo. Повторно відтворені валідні webhook-запити
підтверджуються, але пропускаються для побічних ефектів.
Ходи розмови Twilio містять токен для кожного ходу в callback-викликах <Gather>, тому
застарілі або повторно відтворені callback-виклики мовлення не можуть задовольнити новіший очікуваний хід транскрипту.
Неавтентифіковані webhook-запити відхиляються ще до читання тіла, якщо
немає обов’язкових заголовків підпису провайдера.
Webhook voice-call використовує спільний профіль тіла до автентифікації (64 КБ / 5 секунд),
а також обмеження кількості одночасних запитів на IP до перевірки підпису.
Приклад зі стабільним публічним хостом:
TTS для дзвінків
Voice Call використовує конфігурацію ядраmessages.tts для
потокового відтворення мовлення під час дзвінків. Ви можете перевизначити її в конфігурації плагіна з
тією самою структурою — вона глибоко об’єднується з messages.tts.
- Застарілі ключі
tts.<provider>у конфігурації плагіна (openai,elevenlabs,microsoft,edge) автоматично мігруються вtts.providers.<provider>під час завантаження. У конфігурації, що зберігається в репозиторії, віддавайте перевагу структуріproviders. - Microsoft speech ігнорується для голосових дзвінків (телефонному аудіо потрібен PCM; поточний транспорт Microsoft не надає телефонний вихід PCM).
- Під час увімкненого потокового медіа Twilio використовується ядровий TTS; інакше дзвінки переходять до нативних голосів провайдера.
- Якщо медіапотік Twilio уже активний, Voice Call не переходить на TwiML
<Say>. Якщо в цьому стані телефонний TTS недоступний, запит на відтворення завершується помилкою замість змішування двох шляхів відтворення. - Коли телефонний TTS переходить на резервного провайдера, Voice Call записує попередження в журнал із ланцюжком провайдерів (
from,to,attempts) для налагодження.
Більше прикладів
Використовуйте лише ядровий TTS (без перевизначення):Вхідні дзвінки
Типове значення політики для вхідних дзвінків —disabled. Щоб увімкнути вхідні дзвінки, задайте:
inboundPolicy: "allowlist" — це низькорівневий екран caller ID. Плагін
нормалізує значення From, надане провайдером, і порівнює його з allowFrom.
Перевірка webhook автентифікує доставку від провайдера і цілісність корисного навантаження, але
не доводить право власності на номер абонента PSTN/VoIP. Розглядайте allowFrom як
фільтрацію caller ID, а не як сильну ідентифікацію абонента.
Автовідповіді використовують систему агента. Налаштовуйте через:
responseModelresponseSystemPromptresponseTimeoutMs
Контракт озвученого виводу
Для автовідповідей Voice Call додає до системного prompt суворий контракт озвученого виводу:{"spoken":"..."}
- Ігнорує payload, позначений як контент міркування/помилки.
- Аналізує прямий JSON, JSON у fenced-блоках або вбудовані ключі
"spoken". - Повертається до звичайного тексту й видаляє абзаци на початку, які ймовірно є плануванням/метатекстом.
Поведінка запуску розмови
Для вихідних дзвінків у режиміconversation обробка першого повідомлення прив’язана до стану живого відтворення:
- Очищення черги barge-in і автовідповідь пригнічуються лише поки активно озвучується початкове привітання.
- Якщо початкове відтворення не вдається, дзвінок повертається до стану
listening, а початкове повідомлення лишається в черзі для повторної спроби. - Початкове відтворення для потоків Twilio починається після підключення потоку без додаткової затримки.
Пільговий період після від’єднання потоку Twilio
Коли медіапотік Twilio від’єднується, Voice Call чекає2000ms, перш ніж автоматично завершити дзвінок:
- Якщо потік повторно підключиться протягом цього вікна, автоматичне завершення скасовується.
- Якщо після завершення пільгового періоду потік не буде повторно зареєстровано, дзвінок завершується, щоб запобігти зависанню активних дзвінків.
CLI
latency читає calls.jsonl зі стандартного шляху сховища voice-call. Використовуйте
--file <path>, щоб указати інший журнал, і --last <n>, щоб обмежити аналіз
останніми N записами (типово 200). Вивід містить p50/p90/p99 для
затримки ходу та часу очікування прослуховування.
Інструмент агента
Назва інструмента:voice_call
Дії:
initiate_call(message, to?, mode?)continue_call(callId, message)speak_to_user(callId, message)end_call(callId)get_status(callId)
skills/voice-call/SKILL.md.
Gateway RPC
voicecall.initiate(to?,message,mode?)voicecall.continue(callId,message)voicecall.speak(callId,message)voicecall.end(callId)voicecall.status(callId)