Voice Call (Plugin)
Sprachanrufe für OpenClaw über ein Plugin. Unterstützt ausgehende Benachrichtigungen und mehrstufige Unterhaltungen mit Richtlinien für eingehende Anrufe. Aktuelle Provider:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + XML-Transfer + GetInput speech)mock(Entwicklung/kein Netzwerk)
- Plugin installieren
- Gateway neu starten
- Unter
plugins.entries.voice-call.configkonfigurieren openclaw voicecall ...oder das Toolvoice_callverwenden
Wo es läuft (local vs remote)
Das Voice Call-Plugin läuft innerhalb des Gateway-Prozesses. Wenn Sie ein Remote-Gateway verwenden, installieren/konfigurieren Sie das Plugin auf dem Rechner, auf dem das Gateway läuft, und starten Sie dann das Gateway neu, damit es geladen wird.Installation
Option A: aus npm installieren (empfohlen)
Option B: aus einem lokalen Ordner installieren (Entwicklung, ohne Kopieren)
Konfiguration
Legen Sie die Konfiguration unterplugins.entries.voice-call.config fest:
- Twilio/Telnyx erfordern eine öffentlich erreichbare Webhook-URL.
- Plivo erfordert eine öffentlich erreichbare Webhook-URL.
mockist ein lokaler Entwicklungs-Provider (ohne Netzwerkaufrufe).- Wenn ältere Konfigurationen noch
provider: "log",twilio.fromoder alte OpenAI-Schlüssel unterstreaming.*verwenden, führen Sieopenclaw doctor --fixaus, um sie umzuschreiben. - Telnyx erfordert
telnyx.publicKey(oderTELNYX_PUBLIC_KEY), sofernskipSignatureVerificationnicht auf true gesetzt ist. skipSignatureVerificationist nur für lokale Tests gedacht.- Wenn Sie die kostenlose Stufe von ngrok verwenden, setzen Sie
publicUrlauf die exakte ngrok-URL; die Signaturprüfung wird immer erzwungen. tunnel.allowNgrokFreeTierLoopbackBypass: trueerlaubt Twilio-Webhooks mit ungültigen Signaturen nur, wenntunnel.provider="ngrok"undserve.bindloopback ist (lokaler ngrok-Agent). Nur für lokale Entwicklung verwenden.- URLs der kostenlosen ngrok-Stufe können sich ändern oder Interstitial-Verhalten hinzufügen; wenn
publicUrlabweicht, schlagen Twilio-Signaturen fehl. Für die Produktion sollten Sie eine stabile Domain oder Tailscale funnel bevorzugen. - Standardwerte für Streaming-Sicherheit:
streaming.preStartTimeoutMsschließt Sockets, die niemals einen gültigenstart-Frame senden.
streaming.maxPendingConnectionsbegrenzt die Gesamtzahl nicht authentifizierter Sockets vor dem Start.streaming.maxPendingConnectionsPerIpbegrenzt nicht authentifizierte Sockets vor dem Start pro Quell-IP.streaming.maxConnectionsbegrenzt die Gesamtzahl offener Media-Stream-Sockets (ausstehend + aktiv).- Das Runtime-Fallback akzeptiert diese alten
voice-call-Schlüssel vorerst weiterhin, aber der Umschreibpfad istopenclaw doctor --fix, und der Kompatibilitäts-Shim ist nur vorübergehend.
Streaming-Transkription
streaming wählt einen Echtzeit-Transkriptions-Provider für Live-Audio von Anrufen aus.
Aktuelles Runtime-Verhalten:
streaming.providerist optional. Wenn es nicht gesetzt ist, verwendet Voice Call den ersten registrierten Echtzeit-Transkriptions-Provider.- Derzeit ist der gebündelte Provider OpenAI, registriert durch das gebündelte
openai- Plugin. - Rohkonfiguration im Besitz des Providers liegt unter
streaming.providers.<providerId>. - Wenn
streaming.providerauf einen nicht registrierten Provider zeigt oder überhaupt kein Echtzeit- Transkriptions-Provider registriert ist, protokolliert Voice Call eine Warnung und überspringt Media-Streaming, statt das gesamte Plugin fehlschlagen zu lassen.
- API-Schlüssel:
streaming.providers.openai.apiKeyoderOPENAI_API_KEY - Modell:
gpt-4o-transcribe silenceDurationMs:800vadThreshold:0.5
openclaw doctor --fix migriert:
streaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThreshold
Bereinigung veralteter Anrufe
Verwenden SiestaleCallReaperSeconds, um Anrufe zu beenden, die nie einen abschließenden Webhook erhalten
(zum Beispiel Anrufe im Benachrichtigungsmodus, die nie abgeschlossen werden). Der Standardwert ist 0
(deaktiviert).
Empfohlene Bereiche:
- Produktion:
120–300Sekunden für Benachrichtigungsabläufe. - Halten Sie diesen Wert höher als
maxDurationSeconds, damit normale Anrufe beendet werden können. Ein guter Ausgangswert istmaxDurationSeconds + 30–60Sekunden.
Webhook-Sicherheit
Wenn ein Proxy oder Tunnel vor dem Gateway sitzt, rekonstruiert das Plugin die öffentliche URL für die Signaturprüfung. Diese Optionen steuern, welchen weitergeleiteten Headern vertraut wird.webhookSecurity.allowedHosts setzt eine Allowlist für Hosts aus Weiterleitungs-Headern.
webhookSecurity.trustForwardingHeaders vertraut weitergeleiteten Headern ohne Allowlist.
webhookSecurity.trustedProxyIPs vertraut weitergeleiteten Headern nur dann, wenn die
Remote-IP der Anfrage mit der Liste übereinstimmt.
Der Schutz vor Webhook-Replay ist für Twilio und Plivo aktiviert. Wiederholte gültige Webhook-
Anfragen werden bestätigt, aber bei Seiteneffekten übersprungen.
Twilio-Gesprächszüge enthalten ein Token pro Zug in <Gather>-Callbacks, sodass
veraltete/wiederholte Sprach-Callbacks keinen neueren ausstehenden Transkriptionszug erfüllen können.
Nicht authentifizierte Webhook-Anfragen werden vor dem Lesen des Bodys abgelehnt, wenn die
erforderlichen Signatur-Header des Providers fehlen.
Der voice-call-Webhook verwendet das gemeinsame Body-Profil vor der Authentifizierung (64 KB / 5 Sekunden)
plus eine In-Flight-Begrenzung pro IP vor der Signaturprüfung.
Beispiel mit einem stabilen öffentlichen Host:
TTS für Anrufe
Voice Call verwendet die Kernkonfigurationmessages.tts für
Streaming-Sprachausgabe bei Anrufen. Sie können sie unter der Plugin-Konfiguration mit derselben
Struktur überschreiben — sie wird per Deep-Merge mit messages.tts zusammengeführt.
- Alte
tts.<provider>-Schlüssel innerhalb der Plugin-Konfiguration (openai,elevenlabs,microsoft,edge) werden beim Laden automatisch nachtts.providers.<provider>migriert. Bevorzugen Sie die Strukturprovidersin eingecheckter Konfiguration. - Microsoft speech wird für Sprachanrufe ignoriert (Telefonie-Audio benötigt PCM; der aktuelle Microsoft-Transport stellt keine PCM-Ausgabe für Telefonie bereit).
- Kern-TTS wird verwendet, wenn Twilio-Media-Streaming aktiviert ist; andernfalls fallen Anrufe auf providernative Stimmen zurück.
- Wenn bereits ein Twilio-Media-Stream aktiv ist, fällt Voice Call nicht auf TwiML
<Say>zurück. Wenn Telefonie-TTS in diesem Zustand nicht verfügbar ist, schlägt die Wiedergabeanfrage fehl, statt zwei Wiedergabepfade zu mischen. - Wenn Telefonie-TTS auf einen sekundären Provider zurückfällt, protokolliert Voice Call zur Fehlerdiagnose eine Warnung mit der Provider-Kette (
from,to,attempts).
Weitere Beispiele
Nur Kern-TTS verwenden (ohne Überschreibung):Eingehende Anrufe
Die Standardrichtlinie für eingehende Anrufe istdisabled. Um eingehende Anrufe zu aktivieren, setzen Sie:
inboundPolicy: "allowlist" ist eine Prüfung der Anrufer-ID mit geringer Sicherheit. Das Plugin
normalisiert den vom Provider gelieferten Wert From und vergleicht ihn mit allowFrom.
Die Webhook-Prüfung authentifiziert die Zustellung durch den Provider und die Integrität der Nutzlast,
aber sie beweist nicht den Besitz der PSTN-/VoIP-Anrufernummer. Behandeln Sie allowFrom als
Filterung nach Anrufer-ID, nicht als starke Anruferidentität.
Automatische Antworten verwenden das Agent-System. Abstimmen können Sie es mit:
responseModelresponseSystemPromptresponseTimeoutMs
Vertrag für gesprochene Ausgabe
Für automatische Antworten hängt Voice Call an den System-Prompt einen strengen Vertrag für gesprochene Ausgabe an:{"spoken":"..."}
- Ignoriert Nutzlasten, die als Reasoning-/Fehlerinhalte markiert sind.
- Parst direktes JSON, JSON in Fences oder Inline-Schlüssel
"spoken". - Fällt auf Klartext zurück und entfernt wahrscheinliche einleitende Absätze für Planung/Meta.
Verhalten beim Start von Gesprächen
Bei ausgehenden Anrufen im Modusconversation ist die Behandlung der ersten Nachricht an den Status der Live-Wiedergabe gebunden:
- Leeren der Barge-in-Warteschlange und automatische Antwort werden nur unterdrückt, während die anfängliche Begrüßung aktiv gesprochen wird.
- Wenn die anfängliche Wiedergabe fehlschlägt, kehrt der Anruf zu
listeningzurück, und die erste Nachricht bleibt zur erneuten Ausführung in der Warteschlange. - Die anfängliche Wiedergabe für Twilio-Streaming startet bei Stream-Verbindung ohne zusätzliche Verzögerung.
Kulanzzeit bei Twilio-Stream-Trennung
Wenn eine Twilio-Media-Stream-Verbindung getrennt wird, wartet Voice Call2000ms, bevor der Anruf automatisch beendet wird:
- Wenn der Stream innerhalb dieses Zeitfensters erneut verbunden wird, wird die automatische Beendigung abgebrochen.
- Wenn nach der Kulanzzeit kein Stream erneut registriert wird, wird der Anruf beendet, um hängende aktive Anrufe zu verhindern.
CLI
latency liest calls.jsonl aus dem Standard-Speicherpfad für voice-call. Verwenden Sie
--file <path>, um auf ein anderes Log zu verweisen, und --last <n>, um die Analyse
auf die letzten N Datensätze zu beschränken (Standard 200). Die Ausgabe enthält p50/p90/p99 für Zug-
Latenz und Wartezeiten im Listening-Zustand.
Agent-Tool
Tool-Name:voice_call
Aktionen:
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)