Voice Call (plugin)
Panggilan suara untuk OpenClaw melalui plugin. Mendukung notifikasi keluar dan percakapan multi-putaran dengan kebijakan panggilan masuk. Provider saat ini:twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + transfer XML + GetInput speech)mock(dev/tanpa jaringan)
- Instal plugin
- Restart Gateway
- Konfigurasikan di bawah
plugins.entries.voice-call.config - Gunakan
openclaw voicecall ...atau toolvoice_call
Tempat plugin ini berjalan (lokal vs remote)
Plugin Voice Call berjalan di dalam proses Gateway. Jika Anda menggunakan Gateway remote, instal/konfigurasikan plugin di mesin yang menjalankan Gateway, lalu restart Gateway agar plugin dimuat.Instalasi
Opsi A: instal dari npm (disarankan)
Opsi B: instal dari folder lokal (dev, tanpa menyalin)
Konfigurasi
Setel konfigurasi di bawahplugins.entries.voice-call.config:
- Twilio/Telnyx memerlukan URL webhook yang dapat dijangkau secara publik.
- Plivo memerlukan URL webhook yang dapat dijangkau secara publik.
mockadalah provider dev lokal (tanpa panggilan jaringan).- Jika konfigurasi lama masih menggunakan
provider: "log",twilio.from, atau key OpenAIstreaming.*lawas, jalankanopenclaw doctor --fixuntuk menulis ulangnya. - Telnyx memerlukan
telnyx.publicKey(atauTELNYX_PUBLIC_KEY) kecualiskipSignatureVerificationbernilai true. skipSignatureVerificationhanya untuk pengujian lokal.- Jika Anda menggunakan tier gratis ngrok, setel
publicUrlke URL ngrok yang tepat; verifikasi tanda tangan selalu diterapkan. tunnel.allowNgrokFreeTierLoopbackBypass: truemengizinkan webhook Twilio dengan tanda tangan tidak valid hanya saattunnel.provider="ngrok"danserve.bindadalah loopback (agent lokal ngrok). Gunakan hanya untuk dev lokal.- URL ngrok tier gratis dapat berubah atau menambahkan perilaku interstisial; jika
publicUrlberubah, tanda tangan Twilio akan gagal. Untuk produksi, utamakan domain stabil atau Tailscale funnel. - Default keamanan streaming:
streaming.preStartTimeoutMsmenutup socket yang tidak pernah mengirim framestartyang valid.
streaming.maxPendingConnectionsmembatasi total socket pra-mulai yang belum diautentikasi.streaming.maxPendingConnectionsPerIpmembatasi socket pra-mulai yang belum diautentikasi per IP sumber.streaming.maxConnectionsmembatasi total socket stream media yang terbuka (tertunda + aktif).- Fallback runtime untuk sementara masih menerima key voice-call lama tersebut, tetapi jalur penulisan ulangnya adalah
openclaw doctor --fixdan shim kompatibilitas ini bersifat sementara.
Transkripsi streaming
streaming memilih provider transkripsi realtime untuk audio panggilan langsung.
Perilaku runtime saat ini:
streaming.providerbersifat opsional. Jika tidak disetel, Voice Call menggunakan provider transkripsi realtime pertama yang terdaftar.- Saat ini provider bawaan adalah OpenAI, yang didaftarkan oleh plugin bawaan
openai. - Konfigurasi mentah milik provider berada di bawah
streaming.providers.<providerId>. - Jika
streaming.providermenunjuk ke provider yang tidak terdaftar, atau tidak ada provider transkripsi realtime yang terdaftar sama sekali, Voice Call mencatat peringatan dan melewati streaming media alih-alih menggagalkan seluruh plugin.
- Kunci API:
streaming.providers.openai.apiKeyatauOPENAI_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
Pembersih panggilan basi
GunakanstaleCallReaperSeconds untuk mengakhiri panggilan yang tidak pernah menerima webhook terminal
(misalnya, panggilan mode notify yang tidak pernah selesai). Default-nya adalah 0
(dinonaktifkan).
Rentang yang direkomendasikan:
- Produksi:
120–300detik untuk alur bergaya notify. - Pertahankan nilai ini lebih tinggi dari
maxDurationSecondsagar panggilan normal dapat selesai. Titik awal yang baik adalahmaxDurationSeconds + 30–60detik.
Keamanan Webhook
Saat proxy atau tunnel berada di depan Gateway, plugin membangun ulang URL publik untuk verifikasi tanda tangan. Opsi ini mengontrol header yang diteruskan mana yang dipercaya.webhookSecurity.allowedHosts membuat allowlist host dari header penerusan.
webhookSecurity.trustForwardingHeaders mempercayai header penerusan tanpa allowlist.
webhookSecurity.trustedProxyIPs hanya mempercayai header penerusan saat
IP remote permintaan cocok dengan daftar.
Perlindungan replay webhook diaktifkan untuk Twilio dan Plivo. Permintaan webhook valid yang diputar ulang
diakui tetapi dilewati untuk efek samping.
Giliran percakapan Twilio menyertakan token per giliran dalam callback <Gather>, sehingga
callback ucapan yang basi/diputar ulang tidak dapat memenuhi giliran transkrip tertunda yang lebih baru.
Permintaan webhook yang tidak diautentikasi ditolak sebelum body dibaca saat
header tanda tangan wajib milik provider tidak ada.
Webhook voice-call menggunakan profil body pra-auth bersama (64 KB / 5 detik)
ditambah batas in-flight per-IP sebelum verifikasi tanda tangan.
Contoh dengan host publik stabil:
TTS untuk panggilan
Voice Call menggunakan konfigurasimessages.tts inti untuk
streaming ucapan pada panggilan. Anda dapat menimpanya di bawah konfigurasi plugin dengan
bentuk yang sama — ini di-deep-merge dengan messages.tts.
- Key lama
tts.<provider>di dalam konfigurasi plugin (openai,elevenlabs,microsoft,edge) dimigrasikan otomatis ketts.providers.<provider>saat load. Utamakan bentukprovidersdalam konfigurasi yang dikomit. - Microsoft speech diabaikan untuk panggilan suara (audio telefoni memerlukan PCM; transport Microsoft saat ini tidak mengekspos output PCM telefoni).
- TTS inti digunakan saat streaming media Twilio diaktifkan; jika tidak, panggilan akan fallback ke suara native provider.
- Jika stream media Twilio sudah aktif, Voice Call tidak melakukan fallback ke TwiML
<Say>. Jika TTS telefoni tidak tersedia dalam keadaan tersebut, permintaan pemutaran akan gagal alih-alih mencampur dua jalur pemutaran. - Saat TTS telefoni melakukan fallback ke provider sekunder, Voice Call mencatat peringatan dengan rantai provider (
from,to,attempts) untuk debugging.
Contoh lainnya
Gunakan TTS inti saja (tanpa override):Panggilan masuk
Default kebijakan panggilan masuk adalahdisabled. Untuk mengaktifkan panggilan masuk, setel:
inboundPolicy: "allowlist" adalah penyaringan caller-ID dengan tingkat keyakinan rendah. Plugin
menormalkan nilai From yang diberikan provider dan membandingkannya dengan allowFrom.
Verifikasi webhook mengautentikasi pengiriman provider dan integritas payload, tetapi
tidak membuktikan kepemilikan nomor penelepon PSTN/VoIP. Perlakukan allowFrom sebagai
filter caller-ID, bukan identitas penelepon yang kuat.
Respons otomatis menggunakan sistem agent. Sesuaikan dengan:
responseModelresponseSystemPromptresponseTimeoutMs
Kontrak output lisan
Untuk respons otomatis, Voice Call menambahkan kontrak output lisan yang ketat ke system prompt:{"spoken":"..."}
- Mengabaikan payload yang ditandai sebagai konten penalaran/error.
- Mengurai JSON langsung, JSON berpagar, atau key
"spoken"inline. - Melakukan fallback ke teks biasa dan menghapus paragraf pembuka yang kemungkinan merupakan perencanaan/meta.
Perilaku startup percakapan
Untuk panggilanconversation keluar, penanganan pesan pertama terikat pada status pemutaran langsung:
- Pembersihan antrean barge-in dan respons otomatis ditekan hanya saat salam awal sedang aktif berbicara.
- Jika pemutaran awal gagal, panggilan kembali ke
listeningdan pesan awal tetap masuk antrean untuk dicoba ulang. - Pemutaran awal untuk streaming Twilio dimulai saat stream terhubung tanpa penundaan tambahan.
Grace pemutusan stream Twilio
Saat stream media Twilio terputus, Voice Call menunggu2000ms sebelum mengakhiri panggilan secara otomatis:
- Jika stream tersambung kembali selama jendela itu, pengakhiran otomatis dibatalkan.
- Jika tidak ada stream yang didaftarkan ulang setelah masa grace, panggilan diakhiri untuk mencegah panggilan aktif yang macet.
CLI
latency membaca calls.jsonl dari path penyimpanan voice-call default. Gunakan
--file <path> untuk menunjuk ke log yang berbeda dan --last <n> untuk membatasi analisis
ke N catatan terakhir (default 200). Output mencakup p50/p90/p99 untuk
latensi giliran dan waktu tunggu mendengarkan.
Tool agent
Nama tool:voice_call
Aksi:
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)