Voice Call (plugin)
Chiamate vocali per OpenClaw tramite un plugin. Supporta notifiche in uscita e conversazioni multi-turn con policy in ingresso. Provider attuali:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + trasferimento XML + GetInput speech)mock(sviluppo/senza rete)
- Installa il plugin
- Riavvia il Gateway
- Configura sotto
plugins.entries.voice-call.config - Usa
openclaw voicecall ...o lo strumentovoice_call
Dove viene eseguito (locale vs remoto)
Il plugin Voice Call viene eseguito all’interno del processo Gateway. Se usi un Gateway remoto, installa/configura il plugin sulla macchina che esegue il Gateway, quindi riavvia il Gateway per caricarlo.Installazione
Opzione A: installazione da npm (consigliata)
Opzione B: installazione da una cartella locale (sviluppo, senza copia)
Configurazione
Imposta la configurazione sottoplugins.entries.voice-call.config:
- Twilio/Telnyx richiedono un URL webhook raggiungibile pubblicamente.
- Plivo richiede un URL webhook raggiungibile pubblicamente.
mockè un provider di sviluppo locale (nessuna chiamata di rete).- Se configurazioni meno recenti usano ancora
provider: "log",twilio.fromo chiavi OpenAI legacystreaming.*, eseguiopenclaw doctor --fixper riscriverle. - Telnyx richiede
telnyx.publicKey(oTELNYX_PUBLIC_KEY) a meno cheskipSignatureVerificationnon sia true. skipSignatureVerificationè solo per test locali.- Se usi il livello gratuito di ngrok, imposta
publicUrlsull’URL ngrok esatto; la verifica della firma viene sempre applicata. tunnel.allowNgrokFreeTierLoopbackBypass: trueconsente i webhook Twilio con firme non valide solo quandotunnel.provider="ngrok"eserve.bindè loopback (agente locale ngrok). Usalo solo per sviluppo locale.- Gli URL del livello gratuito di ngrok possono cambiare o aggiungere comportamenti interstiziali; se
publicUrlderiva, le firme Twilio falliranno. Per la produzione, preferisci un dominio stabile o Tailscale funnel. - Valori predefiniti di sicurezza dello streaming:
streaming.preStartTimeoutMschiude i socket che non inviano mai un framestartvalido.
streaming.maxPendingConnectionslimita il totale dei socket pre-start non autenticati.streaming.maxPendingConnectionsPerIplimita i socket pre-start non autenticati per IP sorgente.streaming.maxConnectionslimita il totale dei socket media stream aperti (in attesa + attivi).- Il fallback runtime accetta ancora temporaneamente quelle vecchie chiavi voice-call, ma il percorso di riscrittura è
openclaw doctor --fixe lo shim di compatibilità è temporaneo.
Trascrizione in streaming
streaming seleziona un provider di trascrizione realtime per l’audio delle chiamate live.
Comportamento runtime attuale:
streaming.providerè facoltativo. Se non impostato, Voice Call usa il primo provider di trascrizione realtime registrato.- Oggi il provider incluso è OpenAI, registrato dal plugin incluso
openai. - La configurazione grezza di proprietà del provider si trova in
streaming.providers.<providerId>. - Se
streaming.providerpunta a un provider non registrato, o non è registrato alcun provider di trascrizione realtime, Voice Call registra un avviso e salta lo streaming media invece di far fallire l’intero plugin.
- API key:
streaming.providers.openai.apiKeyoOPENAI_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
Reaper delle chiamate stale
UsastaleCallReaperSeconds per terminare le chiamate che non ricevono mai un webhook terminale
(ad esempio le chiamate in modalità notify che non si completano mai). Il valore predefinito è 0
(disabilitato).
Intervalli consigliati:
- Produzione:
120–300secondi per i flussi in stile notify. - Mantieni questo valore più alto di
maxDurationSecondscosì le chiamate normali possono terminare. Un buon punto di partenza èmaxDurationSeconds + 30–60secondi.
Sicurezza dei webhook
Quando un proxy o un tunnel si trova davanti al Gateway, il plugin ricostruisce l’URL pubblico per la verifica della firma. Queste opzioni controllano quali header inoltrati sono attendibili.webhookSecurity.allowedHosts mette in allowlist gli host dagli header di inoltro.
webhookSecurity.trustForwardingHeaders considera attendibili gli header inoltrati senza allowlist.
webhookSecurity.trustedProxyIPs considera attendibili gli header inoltrati solo quando l’IP remoto
della richiesta corrisponde all’elenco.
La protezione replay dei webhook è abilitata per Twilio e Plivo. Le richieste webhook valide ma ripetute
vengono confermate ma saltate per quanto riguarda gli effetti collaterali.
I turni di conversazione Twilio includono un token per turno nelle callback <Gather>, così
callback vocali stale/ripetute non possono soddisfare un turno di trascrizione più recente in attesa.
Le richieste webhook non autenticate vengono rifiutate prima della lettura del body quando
mancano gli header di firma richiesti dal provider.
Il webhook voice-call usa il profilo body pre-auth condiviso (64 KB / 5 secondi)
più un limite in-flight per IP prima della verifica della firma.
Esempio con un host pubblico stabile:
TTS per le chiamate
Voice Call usa la configurazione coremessages.tts per
lo speech in streaming nelle chiamate. Puoi sovrascriverla nella configurazione del plugin con la
stessa struttura — viene unita in profondità con messages.tts.
- Le chiavi legacy
tts.<provider>nella configurazione del plugin (openai,elevenlabs,microsoft,edge) vengono migrate automaticamente atts.providers.<provider>al caricamento. Preferisci la strutturaprovidersnella configurazione salvata. - Microsoft speech viene ignorato per le chiamate vocali (l’audio di telefonia richiede PCM; il trasporto Microsoft attuale non espone output PCM per telefonia).
- Il TTS core viene usato quando è abilitato lo streaming media Twilio; altrimenti le chiamate ricorrono alle voci native del provider.
- Se è già attivo uno stream media Twilio, Voice Call non usa come fallback TwiML
<Say>. Se in quello stato il TTS di telefonia non è disponibile, la richiesta di riproduzione fallisce invece di mescolare due percorsi di riproduzione. - Quando il TTS di telefonia ricorre a un provider secondario, Voice Call registra un avviso con la catena dei provider (
from,to,attempts) per il debug.
Altri esempi
Usa solo il TTS core (nessun override):Chiamate in ingresso
La policy in ingresso usadisabled come predefinito. Per abilitare le chiamate in ingresso, imposta:
inboundPolicy: "allowlist" è un filtro a bassa affidabilità basato sul caller ID. Il plugin
normalizza il valore From fornito dal provider e lo confronta con allowFrom.
La verifica del webhook autentica la consegna del provider e l’integrità del payload, ma
non prova la proprietà del numero chiamante PSTN/VoIP. Considera allowFrom come
filtro del caller ID, non come forte identità del chiamante.
Le risposte automatiche usano il sistema dell’agente. Puoi regolarle con:
responseModelresponseSystemPromptresponseTimeoutMs
Contratto dell’output parlato
Per le risposte automatiche, Voice Call aggiunge un rigoroso contratto di output parlato al prompt di sistema:{"spoken":"..."}
- Ignora i payload contrassegnati come contenuto di reasoning/errore.
- Analizza JSON diretto, JSON delimitato o chiavi
"spoken"inline. - Ripiega sul testo semplice e rimuove i paragrafi iniziali probabilmente di pianificazione/meta.
Comportamento di avvio della conversazione
Per le chiamate in uscitaconversation, la gestione del primo messaggio è legata allo stato della riproduzione live:
- La cancellazione della coda per il barge-in e la risposta automatica vengono soppresse solo mentre il saluto iniziale viene pronunciato attivamente.
- Se la riproduzione iniziale fallisce, la chiamata torna a
listeninge il messaggio iniziale rimane in coda per un nuovo tentativo. - La riproduzione iniziale per lo streaming Twilio inizia alla connessione dello stream senza ritardi aggiuntivi.
Grace di disconnessione dello stream Twilio
Quando uno stream media Twilio si disconnette, Voice Call attende2000ms prima di terminare automaticamente la chiamata:
- Se lo stream si riconnette durante quella finestra, la terminazione automatica viene annullata.
- Se dopo il periodo di grace non viene nuovamente registrato alcuno stream, la chiamata viene terminata per evitare chiamate attive bloccate.
CLI
latency legge calls.jsonl dal percorso di archiviazione predefinito di voice-call. Usa
--file <path> per puntare a un log diverso e --last <n> per limitare l’analisi
agli ultimi N record (predefinito 200). L’output include p50/p90/p99 per la
latenza dei turni e i tempi di attesa in ascolto.
Strumento dell’agente
Nome dello strumento:voice_call
Azioni:
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.
RPC Gateway
voicecall.initiate(to?,message,mode?)voicecall.continue(callId,message)voicecall.speak(callId,message)voicecall.end(callId)voicecall.status(callId)