Voice Call (plugin)
OpenClaw için bir plugin aracılığıyla sesli aramalar. Giden bildirimleri ve gelen ilkeleriyle çok turlu konuşmaları destekler. Mevcut sağlayıcılar:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + XML aktarımı + GetInput konuşma)mock(geliştirme/ağ yok)
- Plugin’i kurun
- Gateway’i yeniden başlatın
plugins.entries.voice-call.configaltında yapılandırınopenclaw voicecall ...veyavoice_callaracını kullanın
Çalıştığı yer (yerel ve uzak)
Voice Call plugin’i Gateway işleminin içinde çalışır. Uzak bir Gateway kullanıyorsanız, plugin’i Gateway’i çalıştıran makinede kurup yapılandırın, sonra yüklenmesi için Gateway’i yeniden başlatın.Kurulum
Seçenek A: npm’den kurulum (önerilir)
Seçenek B: yerel klasörden kurulum (geliştirme, kopyalama yok)
Yapılandırma
Yapılandırmayıplugins.entries.voice-call.config altında ayarlayın:
- Twilio/Telnyx, genel olarak erişilebilir bir webhook URL’si gerektirir.
- Plivo, genel olarak erişilebilir bir webhook URL’si gerektirir.
mock, yerel bir geliştirme sağlayıcısıdır (ağ çağrısı yok).- Eski yapılandırmalar hâlâ
provider: "log",twilio.fromveya eskistreaming.*OpenAI anahtarlarını kullanıyorsa, bunları yeniden yazmak içinopenclaw doctor --fixçalıştırın. skipSignatureVerificationtrue değilse Telnyx,telnyx.publicKey(veyaTELNYX_PUBLIC_KEY) gerektirir.skipSignatureVerificationyalnızca yerel test içindir.- ngrok ücretsiz katmanını kullanıyorsanız,
publicUrldeğerini tam ngrok URL’si olarak ayarlayın; imza doğrulaması her zaman zorunludur. tunnel.allowNgrokFreeTierLoopbackBypass: true, yalnızcatunnel.provider="ngrok"veserve.bindloopback olduğunda (ngrok yerel ajanı) geçersiz imzalara sahip Twilio webhook’larına izin verir. Yalnızca yerel geliştirme için kullanın.- Ngrok ücretsiz katman URL’leri değişebilir veya araya giren davranış ekleyebilir;
publicUrlkayarsa Twilio imzaları başarısız olur. Üretim için kararlı bir etki alanı veya Tailscale funnel tercih edin. - Akış güvenliği varsayılanları:
streaming.preStartTimeoutMs, hiçbir zaman geçerli birstartçerçevesi göndermeyen soketleri kapatır.
streaming.maxPendingConnections, kimliği doğrulanmamış başlatma öncesi toplam soket sayısını sınırlar.streaming.maxPendingConnectionsPerIp, kaynak IP başına kimliği doğrulanmamış başlatma öncesi soket sayısını sınırlar.streaming.maxConnections, toplam açık medya akışı soketlerini sınırlar (bekleyen + etkin).- Çalışma zamanı yedeği şimdilik bu eski voice-call anahtarlarını kabul etmeye devam eder, ancak yeniden yazma yolu
openclaw doctor --fixkomutudur ve uyumluluk katmanı geçicidir.
Akış transkripsiyonu
streaming, canlı arama sesi için bir gerçek zamanlı transkripsiyon sağlayıcısı seçer.
Geçerli çalışma zamanı davranışı:
streaming.provideristeğe bağlıdır. Ayarlanmazsa Voice Call ilk kayıtlı gerçek zamanlı transkripsiyon sağlayıcısını kullanır.- Bugün paketlenmiş sağlayıcı, paketlenmiş
openaiplugin’i tarafından kaydedilen OpenAI’dir. - Sağlayıcıya ait ham yapılandırma
streaming.providers.<providerId>altında bulunur. streaming.provider, kayıtlı olmayan bir sağlayıcıyı işaret ediyorsa veya hiç gerçek zamanlı transkripsiyon sağlayıcısı kayıtlı değilse, Voice Call bir uyarı günlüğe kaydeder ve tüm plugin’i başarısız kılmak yerine medya akışını atlar.
- API anahtarı:
streaming.providers.openai.apiKeyveyaOPENAI_API_KEY - model:
gpt-4o-transcribe silenceDurationMs:800vadThreshold:0.5
openclaw doctor --fix tarafından otomatik taşınır:
streaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThreshold
Eski çağrı temizleyicisi
Hiçbir zaman son durum webhook’u almayan çağrıları (örneğin, asla tamamlanmayan notify modu çağrıları) sonlandırmak içinstaleCallReaperSeconds kullanın. Varsayılan 0’dır
(devre dışı).
Önerilen aralıklar:
- Üretim: notify tarzı akışlar için
120–300saniye. - Normal çağrıların
bitebilmesi için bu değeri
maxDurationSecondsdeğerinden büyük tutun. İyi bir başlangıç noktasımaxDurationSeconds + 30–60saniyedir.
Webhook Güvenliği
Bir proxy veya tünel Gateway’in önünde bulunduğunda plugin, imza doğrulaması için genel URL’yi yeniden oluşturur. Bu seçenekler hangi yönlendirilmiş üstbilgilerin güvenilir olduğunu denetler.webhookSecurity.allowedHosts, yönlendirme üstbilgilerindeki ana makineler için izin listesi uygular.
webhookSecurity.trustForwardingHeaders, yönlendirme üstbilgilerine izin listesi olmadan güvenir.
webhookSecurity.trustedProxyIPs, yalnızca isteğin
uzak IP’si listedekilerle eşleştiğinde yönlendirme üstbilgilerine güvenir.
Webhook tekrar oynatma koruması Twilio ve Plivo için etkindir. Yeniden oynatılan geçerli webhook
istekleri onaylanır ancak yan etkiler için atlanır.
Twilio konuşma turları, <Gather> geri çağrılarında tur başına bir belirteç içerir; böylece
eski/yeniden oynatılmış konuşma geri çağrıları daha yeni bekleyen bir transkript turunu karşılayamaz.
Kimliği doğrulanmamış webhook istekleri, sağlayıcının gerekli imza üstbilgileri eksik olduğunda
gövde okunmadan önce reddedilir.
voice-call webhook’u, imza doğrulamasından önce paylaşılan ön-kimlik doğrulama gövde profilini (64 KB / 5 saniye)
ve IP başına işlemde üst sınırını kullanır.
Kararlı bir genel ana makineyle örnek:
Aramalar için TTS
Voice Call, aramalarda akış konuşması için çekirdekmessages.tts yapılandırmasını kullanır.
Bunu plugin yapılandırması altında aynı biçimle
geçersiz kılabilirsiniz — messages.tts ile derinlemesine birleştirilir.
- Plugin yapılandırması içindeki eski
tts.<provider>anahtarları (openai,elevenlabs,microsoft,edge) yükleme sırasında otomatik olaraktts.providers.<provider>biçimine taşınır. Kaydedilmiş yapılandırmadaprovidersbiçimini tercih edin. - Microsoft speech, sesli aramalar için yok sayılır (telefon sesinin PCM olması gerekir; mevcut Microsoft taşıması telefon PCM çıkışını açığa çıkarmaz).
- Twilio medya akışı etkin olduğunda çekirdek TTS kullanılır; aksi halde aramalar sağlayıcının yerel seslerine geri döner.
- Bir Twilio medya akışı zaten etkinse Voice Call, TwiML
<Say>kullanımına geri dönmez. Telefon TTS bu durumda kullanılamıyorsa, iki oynatma yolunu karıştırmak yerine oynatma isteği başarısız olur. - Telefon TTS ikinci bir sağlayıcıya geri düştüğünde Voice Call, hata ayıklama için sağlayıcı zinciriyle (
from,to,attempts) bir uyarı günlüğe kaydeder.
Daha fazla örnek
Yalnızca çekirdek TTS kullanın (geçersiz kılma yok):Gelen aramalar
Gelen ilke varsayılan olarakdisabled durumundadır. Gelen aramaları etkinleştirmek için şunu ayarlayın:
inboundPolicy: "allowlist", düşük güvence düzeyine sahip bir arayan kimliği ekranıdır. Plugin,
sağlayıcı tarafından verilen From değerini normalleştirir ve allowFrom ile karşılaştırır.
Webhook doğrulaması sağlayıcı teslimini ve yük bütünlüğünü doğrular, ancak
PSTN/VoIP arayan numara sahipliğini kanıtlamaz. allowFrom değerini güçlü arayan kimliği yerine
arayan kimliği filtreleme olarak değerlendirin.
Otomatik yanıtlar ajan sistemini kullanır. Şunlarla ince ayar yapın:
responseModelresponseSystemPromptresponseTimeoutMs
Sesli çıktı sözleşmesi
Otomatik yanıtlar için Voice Call, sistem istemine sıkı bir sesli çıktı sözleşmesi ekler:{"spoken":"..."}
- Akıl yürütme/hata içeriği olarak işaretlenmiş yükleri yok sayar.
- Doğrudan JSON, çitlenmiş JSON veya satır içi
"spoken"anahtarlarını ayrıştırır. - Düz metne geri döner ve olası planlama/meta giriş paragraflarını kaldırır.
Konuşma başlangıç davranışı
Gidenconversation çağrıları için ilk mesaj işleme, canlı oynatma durumuna bağlıdır:
- Araya girme kuyruğu temizleme ve otomatik yanıt, yalnızca ilk selamlama etkin olarak konuşulurken bastırılır.
- İlk oynatma başarısız olursa çağrı
listeningdurumuna döner ve ilk mesaj yeniden deneme için kuyrukta kalır. - Twilio akışı için ilk oynatma, ek gecikme olmadan akış bağlandığında başlar.
Twilio akış bağlantı kesilmesi toleransı
Bir Twilio medya akışı bağlantısı kesildiğinde Voice Call, çağrıyı otomatik sonlandırmadan önce2000ms bekler:
- Akış bu pencere sırasında yeniden bağlanırsa otomatik sonlandırma iptal edilir.
- Tolerans süresinden sonra hiçbir akış yeniden kaydedilmezse, takılı kalmış etkin çağrıları önlemek için çağrı sonlandırılır.
CLI
latency, varsayılan voice-call depolama yolundan calls.jsonl dosyasını okur. Farklı bir günlüğü işaret etmek için
--file <path>, analizi son N kayıta sınırlandırmak için --last <n> kullanın
(varsayılan 200). Çıktı, tur gecikmesi ve dinleme-bekleme süreleri için
p50/p90/p99 değerlerini içerir.
Ajan aracı
Araç adı:voice_call
Eylemler:
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 konumunda eşleşen bir Skills belgesi gönderir.
Gateway RPC
voicecall.initiate(to?,message,mode?)voicecall.continue(callId,message)voicecall.speak(callId,message)voicecall.end(callId)voicecall.status(callId)