twilio(Programmable Voice + Media Streams)telnyx(Call Control v2)plivo(Voice API + XML transfer + GetInput speech)mock(開発用 / ネットワーク不要)
- plugin をインストールする
- ゲートウェイを再起動する
plugins.entries.voice-call.configに設定を書くopenclaw voicecall ...またはvoice_callツールを使う
実行場所(local / remote)
Voice Call plugin は ゲートウェイ プロセス内 で動作します。 remote ゲートウェイを使う場合は、ゲートウェイが動作しているマシン にインストールと設定を行い、その後ゲートウェイを再起動して読み込ませてください。インストール
Option A: npm からインストールする(推奨)
Option B: ローカル フォルダーからインストールする(開発向け、コピーなし)
設定
設定はplugins.entries.voice-call.config 配下に置きます。
- Twilio / Telnyx では、public に到達可能な webhook URL が必要です。
- Plivo でも、public に到達可能な webhook URL が必要です。
mockはローカル開発用 provider で、ネットワーク呼び出しを行いません。- Telnyx では、
skipSignatureVerificationが true でない限り、telnyx.publicKey(またはTELNYX_PUBLIC_KEY)が必要です。 skipSignatureVerificationはローカル テスト専用です。- ngrok の無料プランを使う場合は、
publicUrlに実際の ngrok URL を正確に設定してください。署名検証は常に有効です。 tunnel.allowNgrokFreeTierLoopbackBypass: trueは、tunnel.provider="ngrok"かつserve.bindが loopback(ngrok local agent)の場合に限り、無効な署名を持つ Twilio webhook を許可します。ローカル開発専用です。- ngrok の無料 URL は変わる場合があり、interstitial が入ることもあります。
publicUrlがずれると Twilio の署名検証は失敗します。本番では安定した独自ドメインか Tailscale funnel を推奨します。 - streaming セキュリティの既定値:
streaming.preStartTimeoutMsは、有効なstartframe を送らない socket を閉じます。streaming.maxPendingConnectionsは、未認証の pre-start socket 総数を制限します。streaming.maxPendingConnectionsPerIpは、送信元 IP ごとの未認証 pre-start socket 数を制限します。streaming.maxConnectionsは、開いている media stream socket の総数(pending + active)を制限します。
Stale call reaper
staleCallReaperSeconds を使うと、終端 webhook を受け取らない通話を終了できます。たとえば、完了しない notify-mode の通話が対象です。既定値は 0(無効)です。
推奨レンジ:
- 本番: notify 系フローなら
120〜300秒 - 正常な通話を途中で刈り取らないよう、この値は
maxDurationSecondsより大きく 設定してください。目安はmaxDurationSeconds + 30〜60秒です。
Webhook Security
proxy や tunnel がゲートウェイの前段にある場合、plugin は署名検証のために public URL を再構築します。ここでは、どの forwarded header を信頼するかを制御します。webhookSecurity.allowedHosts は、forwarding header 由来の host を allowlist します。
webhookSecurity.trustForwardingHeaders は、allowlist なしで forwarded header を信頼します。
webhookSecurity.trustedProxyIPs は、request の remote IP が一致した場合にのみ forwarded header を信頼します。
Webhook replay protection は Twilio と Plivo で有効です。正しい署名を持つ replay 済み webhook は受理されますが、副作用処理はスキップされます。
Twilio の会話ターンでは、<Gather> callback にターンごとのトークンを含めるため、古い / replay 済みの音声 callback が、新しい待機中 transcript turn を満たすことはありません。
安定した public host を使う例:
通話時の TTS
Voice Call は、コアのmessages.tts 設定(OpenAI または ElevenLabs)を使って通話中の音声ストリーミングを行います。plugin 側で 同じ構造 のまま上書きでき、その内容は messages.tts と deep-merge されます。
- 音声通話では Edge TTS は使われません。 電話音声は PCM を必要とし、Edge の出力は安定しないためです。
- Twilio media streaming が有効なら core TTS を使い、そうでない場合は provider の native voice へフォールバックします。
追加例
core TTS のみを使う場合(override なし):着信通話
着信ポリシーの既定値はdisabled です。着信を有効化するには次のように設定します。
responseModelresponseSystemPromptresponseTimeoutMs
CLI
Agent tool
tool 名:voice_call
actions:
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)