Spraakoproepen voor OpenClaw via een plugin. Ondersteunt uitgaande meldingen, gesprekken met meerdere beurten, full-duplex realtime spraak, streaming transcriptie, en inkomende oproepen met allowlist-beleid. Huidige providers:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
twilio (Programmable Voice + Media Streams),
telnyx (Call Control v2), plivo (Voice API + XML-overdracht + GetInput
spraak), mock (dev/geen netwerk).
De Voice Call-plugin draait binnen het Gateway-proces. Als je een
externe Gateway gebruikt, installeer en configureer de plugin op de machine
waarop de Gateway draait, en herstart daarna de Gateway om deze te laden.
Snelstart
Install the plugin
- From npm
- From a local folder (dev)
Configure provider and webhook
Stel de configuratie in onder
plugins.entries.voice-call.config (zie
Configuratie hieronder voor de volledige vorm). Minimaal:
provider, providerreferenties, fromNumber, en een publiek bereikbare
Webhook-URL.Verify setup
streaming of realtime) actief is. Gebruik
--json voor scripts.Configuratie
Alsenabled: true is ingesteld maar de geselecteerde provider referenties mist,
loggen Gateway-startups een waarschuwing dat de setup onvolledig is met de
ontbrekende sleutels en wordt het starten van de runtime overgeslagen. Commands,
RPC-aanroepen en agent-tools blijven bij gebruik de exacte ontbrekende
providerconfiguratie teruggeven.
Voice-call-referenties accepteren SecretRefs.
plugins.entries.voice-call.config.twilio.authToken en plugins.entries.voice-call.config.tts.providers.*.apiKey worden opgelost via het standaard SecretRef-oppervlak; zie SecretRef-referentieoppervlak.Provider exposure and security notes
Provider exposure and security notes
- Twilio, Telnyx en Plivo vereisen allemaal een publiek bereikbare Webhook-URL.
mockis een lokale dev-provider (geen netwerkaanroepen).- Telnyx vereist
telnyx.publicKey(ofTELNYX_PUBLIC_KEY) tenzijskipSignatureVerificationtrue is. skipSignatureVerificationis alleen voor lokale tests.- Stel op de gratis laag van ngrok
publicUrlin op de exacte ngrok-URL; handtekeningverificatie wordt altijd afgedwongen. tunnel.allowNgrokFreeTierLoopbackBypass: truestaat Twilio-webhooks met ongeldige handtekeningen alleen toe wanneertunnel.provider="ngrok"is enserve.bindloopback is (lokale ngrok-agent). Alleen lokale dev.- URL’s op de gratis ngrok-laag kunnen veranderen of interstitial-gedrag toevoegen; als
publicUrlafwijkt, mislukken Twilio-handtekeningen. Productie: geef de voorkeur aan een stabiel domein of een Tailscale-funnel.
Streaming connection caps
Streaming connection caps
streaming.preStartTimeoutMssluit sockets die nooit een geldigstart-frame verzenden.streaming.maxPendingConnectionsbegrenst het totale aantal niet-geverifieerde pre-start-sockets.streaming.maxPendingConnectionsPerIpbegrenst niet-geverifieerde pre-start-sockets per bron-IP.streaming.maxConnectionsbegrenst het totale aantal open mediastream-sockets (pending + actief).
Legacy config migrations
Legacy config migrations
Oudere configuraties met
provider: "log", twilio.from, of verouderde
streaming.* OpenAI-sleutels worden herschreven door openclaw doctor --fix.
Runtime-fallback accepteert de oude voice-call-sleutels voorlopig nog, maar
het herschrijfpad is openclaw doctor --fix en de compat-shim is
tijdelijk.Automatisch gemigreerde streaming-sleutels:streaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThreshold
Realtime spraakgesprekken
realtime selecteert een full-duplex realtime spraakprovider voor live oproepaudio.
Dit staat los van streaming, dat audio alleen doorstuurt naar realtime
transcriptieproviders.
Huidig runtimegedrag:
realtime.enabledwordt ondersteund voor Twilio Media Streams.realtime.provideris optioneel. Als dit niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime spraakprovider.- Gebundelde realtime spraakproviders: Google Gemini Live (
google) en OpenAI (openai), geregistreerd door hun providerplugins. - Ruwe configuratie die eigendom is van de provider staat onder
realtime.providers.<providerId>. - Voice Call stelt standaard de gedeelde realtime-tool
openclaw_agent_consultbeschikbaar. Het realtime model kan deze aanroepen wanneer de beller om dieper redeneren, actuele informatie of normale OpenClaw-tools vraagt. - Als
realtime.providernaar een niet-geregistreerde provider wijst, of als er helemaal geen realtime spraakprovider is geregistreerd, logt Voice Call een waarschuwing en slaat realtime media over in plaats van de hele plugin te laten mislukken. - Consult-sessiesleutels hergebruiken de bestaande spraaksessie wanneer die beschikbaar is, en vallen daarna terug op het telefoonnummer van de beller/gebelde zodat vervolg-consultaanroepen context tijdens de oproep behouden.
Toolbeleid
realtime.toolPolicy beheert de consult-run:
| Beleid | Gedrag |
|---|---|
safe-read-only | Stel de consult-tool beschikbaar en beperk de reguliere agent tot read, web_search, web_fetch, x_search, memory_search, en memory_get. |
owner | Stel de consult-tool beschikbaar en laat de reguliere agent het normale agent-toolbeleid gebruiken. |
none | Stel de consult-tool niet beschikbaar. Aangepaste realtime.tools worden nog steeds doorgegeven aan de realtime provider. |
Voorbeelden van realtime providers
- Google Gemini Live
- OpenAI
Standaarden: API-sleutel uit
realtime.providers.google.apiKey,
GEMINI_API_KEY, of GOOGLE_GENERATIVE_AI_API_KEY; model
gemini-2.5-flash-native-audio-preview-12-2025; stem Kore.Streaming transcriptie
streaming selecteert een realtime transcriptieprovider voor live oproepaudio.
Huidig runtimegedrag:
streaming.provideris optioneel. Als dit niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime transcriptieprovider.- Gebundelde realtime transcriptieproviders: Deepgram (
deepgram), ElevenLabs (elevenlabs), Mistral (mistral), OpenAI (openai), en xAI (xai), geregistreerd door hun providerplugins. - Ruwe configuratie die eigendom is van de provider staat onder
streaming.providers.<providerId>. - Als
streaming.providernaar een niet-geregistreerde provider wijst, of als er geen is geregistreerd, logt Voice Call een waarschuwing en slaat mediastreaming over in plaats van de hele plugin te laten mislukken.
Voorbeelden van streaming providers
- OpenAI
- xAI
Standaarden: API-sleutel
streaming.providers.openai.apiKey of
OPENAI_API_KEY; model gpt-4o-transcribe; silenceDurationMs: 800;
vadThreshold: 0.5.TTS voor oproepen
Voice Call gebruikt de kernconfiguratiemessages.tts voor streaming
spraak in oproepen. Je kunt dit overschrijven onder de Plugin-configuratie met
dezelfde vorm — deze wordt diep samengevoegd met messages.tts.
- Verouderde
tts.<provider>-sleutels binnen Plugin-configuratie (openai,elevenlabs,microsoft,edge) worden hersteld dooropenclaw doctor --fix; vastgelegde configuratie moettts.providers.<provider>gebruiken. - Kern-TTS wordt gebruikt wanneer Twilio-mediastreaming is ingeschakeld; anders vallen oproepen terug op provider-native stemmen.
- Als er al een Twilio-mediastream actief is, valt Voice Call niet terug op TwiML
<Say>. Als telefonie-TTS in die toestand niet beschikbaar is, mislukt het afspeelverzoek in plaats van twee afspeelpaden te mengen. - Wanneer telefonie-TTS terugvalt op een secundaire provider, logt Voice Call een waarschuwing met de providerketen (
from,to,attempts) voor foutopsporing. - Wanneer Twilio-barge-in of streamafbraak de wachtende TTS-wachtrij wist, worden in de wachtrij geplaatste afspeelverzoeken afgehandeld in plaats van bellers te laten wachten op voltooiing van het afspelen.
TTS-voorbeelden
- Core TTS only
- Override to ElevenLabs (calls only)
- OpenAI model override (deep-merge)
Inkomende oproepen
Inkomend beleid staat standaard opdisabled. Stel het volgende in om inkomende oproepen in te schakelen:
responseModel,
responseSystemPrompt en responseTimeoutMs.
Contract voor gesproken uitvoer
Voor automatische antwoorden voegt Voice Call een strikt contract voor gesproken uitvoer toe aan de systeemprompt:- Negeert payloads die zijn gemarkeerd als redeneer-/foutinhoud.
- Parset directe JSON, omheinde JSON of inline
"spoken"-sleutels. - Valt terug op platte tekst en verwijdert waarschijnlijke inleidende alinea’s met planning/meta-informatie.
Gedrag bij gespreksstart
Voor uitgaandeconversation-oproepen is de afhandeling van het eerste bericht gekoppeld aan de live
afspeelstatus:
- Het wissen van de barge-in-wachtrij en automatisch antwoord worden alleen onderdrukt terwijl de eerste begroeting actief wordt uitgesproken.
- Als het eerste afspelen mislukt, keert de oproep terug naar
listeningen blijft het eerste bericht in de wachtrij staan voor een nieuwe poging. - Het eerste afspelen voor Twilio-streaming begint bij streamverbinding zonder extra vertraging.
- Barge-in breekt actief afspelen af en wist Twilio TTS-items die in de wachtrij staan maar nog niet worden afgespeeld. Gewiste items worden als overgeslagen afgehandeld, zodat de logica voor vervolgantwoorden kan doorgaan zonder te wachten op audio die nooit wordt afgespeeld.
- Realtime spraakgesprekken gebruiken de eigen openingsturn van de realtime-stream. Voice Call plaatst geen verouderde TwiML-update met
<Say>voor dat eerste bericht, zodat uitgaande<Connect><Stream>-sessies gekoppeld blijven.
Respijt bij verbreken van Twilio-stream
Wanneer een Twilio-mediastream wordt verbroken, wacht Voice Call 2000 ms voordat het gesprek automatisch wordt beëindigd:- Als de stream binnen dat venster opnieuw verbinding maakt, wordt automatisch beëindigen geannuleerd.
- Als er na de respijtperiode geen stream opnieuw wordt geregistreerd, wordt het gesprek beëindigd om vastgelopen actieve gesprekken te voorkomen.
Opruimer voor verlopen gesprekken
GebruikstaleCallReaperSeconds om gesprekken te beëindigen die nooit een terminale
Webhook ontvangen (bijvoorbeeld notify-modusgesprekken die nooit worden voltooid). De standaardwaarde
is 0 (uitgeschakeld).
Aanbevolen bereiken:
- Productie:
120–300seconden voor notify-achtige flows. - Houd deze waarde hoger dan
maxDurationSecondszodat normale gesprekken kunnen worden afgerond. Een goed startpunt ismaxDurationSeconds + 30–60seconden.
Webhook-beveiliging
Wanneer een proxy of tunnel voor de Gateway staat, reconstrueert de plugin de openbare URL voor handtekeningverificatie. Deze opties bepalen welke doorgestuurde headers worden vertrouwd:Sta hosts uit forwarding-headers toe via een allowlist.
Vertrouw doorgestuurde headers zonder allowlist.
Vertrouw doorgestuurde headers alleen wanneer het externe IP-adres van het verzoek overeenkomt met de lijst.
- Webhook-replaybeveiliging is ingeschakeld voor Twilio en Plivo. Opnieuw afgespeelde geldige Webhook-verzoeken worden bevestigd, maar overgeslagen voor neveneffecten.
- Twilio-gespreksbeurten bevatten een token per beurt in
<Gather>-callbacks, zodat verlopen/opnieuw afgespeelde spraakcallbacks geen nieuwere wachtende transcriptiebeurt kunnen vervullen. - Niet-geverifieerde Webhook-verzoeken worden geweigerd voordat bodies worden gelezen wanneer de vereiste handtekeningheaders van de provider ontbreken.
- De voice-call-Webhook gebruikt het gedeelde pre-auth-bodyprofiel (64 KB / 5 seconden) plus een per-IP-limiet voor gelijktijdige lopende verzoeken vóór handtekeningverificatie.
CLI
latency leest calls.jsonl uit het standaardopslagpad voor voice-call.
Gebruik --file <path> om naar een ander log te verwijzen en --last <n> om de
analyse te beperken tot de laatste N records (standaard 200). De uitvoer bevat p50/p90/p99
voor beurtlatentie en luister-wachttijden.
Agent-tool
Toolnaam:voice_call.
| Actie | Argumenten |
|---|---|
initiate_call | message, to?, mode? |
continue_call | callId, message |
speak_to_user | callId, message |
send_dtmf | callId, digits |
end_call | callId |
get_status | callId |
skills/voice-call/SKILL.md.
Gateway-RPC
| Methode | Argumenten |
|---|---|
voicecall.initiate | to?, message, mode? |
voicecall.continue | callId, message |
voicecall.speak | callId, message |
voicecall.dtmf | callId, digits |
voicecall.end | callId |
voicecall.status | callId |