Voice Call (wtyczka)
Połączenia głosowe dla OpenClaw przez wtyczkę. Obsługuje powiadomienia wychodzące i wieloturowe rozmowy z zasadami dla połączeń przychodzących. Obecni dostawcy:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + XML transfer + GetInput speech)mock(deweloperski/bez sieci)
- Zainstaluj wtyczkę
- Uruchom ponownie Gateway
- Skonfiguruj w
plugins.entries.voice-call.config - Użyj
openclaw voicecall ...lub narzędziavoice_call
Gdzie to działa (lokalnie vs zdalnie)
Wtyczka Voice Call działa wewnątrz procesu Gateway. Jeśli używasz zdalnego Gateway, zainstaluj/skonfiguruj wtyczkę na maszynie, na której działa Gateway, a następnie uruchom ponownie Gateway, aby ją załadować.Instalacja
Opcja A: instalacja z npm (zalecane)
Opcja B: instalacja z folderu lokalnego (dewelopersko, bez kopiowania)
Konfiguracja
Ustaw konfigurację wplugins.entries.voice-call.config:
- Twilio/Telnyx wymagają publicznie dostępnego adresu URL webhooka.
- Plivo wymaga publicznie dostępnego adresu URL webhooka.
mockto lokalny dostawca deweloperski (bez wywołań sieciowych).- Jeśli starsze konfiguracje nadal używają
provider: "log",twilio.fromlub starszych kluczystreaming.*OpenAI, uruchomopenclaw doctor --fix, aby je przepisać. - Telnyx wymaga
telnyx.publicKey(lubTELNYX_PUBLIC_KEY), chyba żeskipSignatureVerificationma wartość true. skipSignatureVerificationsłuży wyłącznie do testów lokalnych.- Jeśli używasz darmowej warstwy ngrok, ustaw
publicUrlna dokładny adres URL ngrok; weryfikacja sygnatur jest zawsze wymuszana. tunnel.allowNgrokFreeTierLoopbackBypass: truepozwala na webhooki Twilio z nieprawidłowymi sygnaturami tylko gdytunnel.provider="ngrok"iserve.bindto loopback (lokalny agent ngrok). Używaj tylko do lokalnego developmentu.- Adresy URL darmowej warstwy ngrok mogą się zmieniać lub dodawać zachowanie pośrednie; jeśli
publicUrlsię rozjedzie, sygnatury Twilio przestaną przechodzić. W środowisku produkcyjnym preferuj stabilną domenę lub Tailscale funnel. - Domyślne zabezpieczenia streamingu:
streaming.preStartTimeoutMszamyka gniazda, które nigdy nie wyślą prawidłowej ramkistart.
streaming.maxPendingConnectionsogranicza łączną liczbę nieuwierzytelnionych gniazd przed startem.streaming.maxPendingConnectionsPerIpogranicza liczbę nieuwierzytelnionych gniazd przed startem na źródłowy adres IP.streaming.maxConnectionsogranicza łączną liczbę otwartych gniazd strumienia mediów (oczekujące + aktywne).- Runtime nadal tymczasowo akceptuje te stare klucze voice-call, ale ścieżką przepisywania jest
openclaw doctor --fix, a shim zgodności ma charakter tymczasowy.
Transkrypcja streamingu
streaming wybiera dostawcę transkrypcji realtime dla dźwięku połączenia na żywo.
Obecne zachowanie runtime:
streaming.providerjest opcjonalne. Jeśli nie jest ustawione, Voice Call używa pierwszego zarejestrowanego dostawcy transkrypcji realtime.- Obecnie wbudowanym dostawcą jest OpenAI, rejestrowany przez wbudowaną wtyczkę
openai. - Surowa konfiguracja należąca do dostawcy znajduje się w
streaming.providers.<providerId>. - Jeśli
streaming.providerwskazuje na niezarejestrowanego dostawcę lub w ogóle nie jest zarejestrowany żaden dostawca transkrypcji realtime, Voice Call zapisuje ostrzeżenie w logu i pomija streaming mediów zamiast powodować błąd całej wtyczki.
- Klucz API:
streaming.providers.openai.apiKeylubOPENAI_API_KEY - model:
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
Mechanizm czyszczenia nieaktualnych połączeń
UżyjstaleCallReaperSeconds, aby kończyć połączenia, które nigdy nie otrzymają końcowego webhooka
(na przykład połączenia w trybie notify, które nigdy się nie kończą). Wartość domyślna to 0
(wyłączone).
Zalecane zakresy:
- Produkcja:
120–300sekund dla przepływów w stylu notify. - Utrzymuj tę wartość wyższą niż
maxDurationSeconds, aby normalne połączenia mogły się zakończyć. Dobrym punktem wyjścia jestmaxDurationSeconds + 30–60sekund.
Zabezpieczenia webhooków
Gdy przed Gateway znajduje się proxy lub tunel, wtyczka rekonstruuje publiczny URL na potrzeby weryfikacji sygnatury. Te opcje kontrolują, którym przekazywanym nagłówkom można ufać.webhookSecurity.allowedHosts tworzy listę dozwolonych hostów z nagłówków przekazywania.
webhookSecurity.trustForwardingHeaders ufa nagłówkom przekazywania bez listy dozwolonych hostów.
webhookSecurity.trustedProxyIPs ufa nagłówkom przekazywania tylko wtedy, gdy
zdalny adres IP żądania pasuje do listy.
Ochrona przed powtórzeniami webhooków jest włączona dla Twilio i Plivo. Powtórzone prawidłowe żądania webhooka
są potwierdzane, ale ich skutki uboczne są pomijane.
Tury rozmowy Twilio zawierają token per-turn w callbackach <Gather>, więc
stare/powtórzone callbacki mowy nie mogą zaspokoić nowszej oczekującej tury transkrypcji.
Nieuwierzytelnione żądania webhooka są odrzucane przed odczytem treści, gdy
brakuje wymaganych nagłówków sygnatur danego dostawcy.
Webhook voice-call używa współdzielonego profilu treści pre-auth (64 KB / 5 sekund)
plus limitu aktywnych żądań na IP przed weryfikacją sygnatury.
Przykład ze stabilnym publicznym hostem:
TTS dla połączeń
Voice Call używa podstawowej konfiguracjimessages.tts do
strumieniowego odtwarzania mowy w połączeniach. Możesz ją nadpisać w konfiguracji wtyczki
tym samym kształtem — jest głęboko scalana z messages.tts.
- Starsze klucze
tts.<provider>w konfiguracji wtyczki (openai,elevenlabs,microsoft,edge) są automatycznie migrowane podczas ładowania dotts.providers.<provider>. W zapisanej konfiguracji preferuj strukturęproviders. - Microsoft speech jest ignorowany przy połączeniach głosowych (dźwięk telefoniczny wymaga PCM; obecny transport Microsoft nie udostępnia wyjścia PCM dla telefonii).
- Podstawowy TTS jest używany, gdy włączony jest streaming mediów Twilio; w przeciwnym razie połączenia wracają do natywnych głosów dostawcy.
- Jeśli strumień mediów Twilio jest już aktywny, Voice Call nie wraca do TwiML
<Say>. Jeśli TTS telefoniczny jest niedostępny w tym stanie, żądanie odtworzenia kończy się błędem zamiast mieszać dwie ścieżki odtwarzania. - Gdy telefoniczny TTS wraca do dostawcy zapasowego, Voice Call zapisuje ostrzeżenie w logu z łańcuchem dostawców (
from,to,attempts) na potrzeby debugowania.
Więcej przykładów
Użyj tylko podstawowego TTS (bez nadpisania):Połączenia przychodzące
Domyślna wartośćinboundPolicy to disabled. Aby włączyć połączenia przychodzące, ustaw:
inboundPolicy: "allowlist" to filtr numeru dzwoniącego o niskim poziomie pewności. Wtyczka
normalizuje wartość From dostarczoną przez dostawcę i porównuje ją z allowFrom.
Weryfikacja webhooka uwierzytelnia dostarczenie przez dostawcę i integralność ładunku,
ale nie potwierdza własności numeru dzwoniącego PSTN/VoIP. Traktuj allowFrom jako
filtrowanie caller ID, a nie silną tożsamość rozmówcy.
Automatyczne odpowiedzi używają systemu agentów. Dostosuj je za pomocą:
responseModelresponseSystemPromptresponseTimeoutMs
Kontrakt danych wyjściowych mowy
Dla automatycznych odpowiedzi Voice Call dołącza do promptu systemowego ścisły kontrakt danych wyjściowych mowy:{"spoken":"..."}
- Ignoruje ładunki oznaczone jako treść typu reasoning/error.
- Parsuje bezpośredni JSON, JSON w bloku kodu lub wbudowane klucze
"spoken". - Wraca do zwykłego tekstu i usuwa prawdopodobne wprowadzające akapity planowania/meta.
Zachowanie uruchamiania rozmowy
Dla połączeń wychodzącychconversation obsługa pierwszej wiadomości jest powiązana ze stanem odtwarzania na żywo:
- Czyszczenie kolejki barge-in i automatyczna odpowiedź są wyłączane tylko wtedy, gdy początkowe powitanie jest aktywnie odtwarzane.
- Jeśli początkowe odtwarzanie się nie powiedzie, połączenie wraca do stanu
listening, a początkowa wiadomość pozostaje w kolejce do ponowienia. - Początkowe odtwarzanie dla streamingu Twilio zaczyna się po połączeniu strumienia bez dodatkowego opóźnienia.
Okres łaski po rozłączeniu strumienia Twilio
Gdy strumień mediów Twilio zostanie rozłączony, Voice Call czeka2000ms przed automatycznym zakończeniem połączenia:
- Jeśli strumień połączy się ponownie w tym oknie, automatyczne zakończenie jest anulowane.
- Jeśli po okresie łaski żaden strumień nie zostanie ponownie zarejestrowany, połączenie jest kończone, aby zapobiec zablokowanym aktywnym połączeniom.
CLI
latency odczytuje calls.jsonl z domyślnej ścieżki przechowywania voice-call. Użyj
--file <path>, aby wskazać inny log, oraz --last <n>, aby ograniczyć analizę
do ostatnich N rekordów (domyślnie 200). Dane wyjściowe obejmują p50/p90/p99 dla opóźnienia tury i czasów oczekiwania nasłuchu.
Narzędzie agenta
Nazwa narzędzia:voice_call
Akcje:
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)