Files
openclaw/docs/cli/voicecall.md
T
Peter Steinberger 1ca4103fe9 fix(voice-call): expose realtime/streaming stream paths through tailscale serve/funnel (#125468)
* fix(voice-call): expose realtime/streaming stream paths through tailscale serve/funnel

Tailscale serve/funnel now auto-exposes the realtime and streaming WebSocket stream paths when those audio modes are enabled; previously Twilio <Connect><Stream> could not reach wss://<ts-host><streamPath> and realtime calls dropped after ~1s with no log.

Also: CLI voicecall expose mounts/clears stream paths symmetrically, partial tailscale mounts roll back on failure, and a warning now fires when a call's stream WebSocket never arrives within the token TTL. Reported/observed live by Peter Steinberger.

* fix(voice-call): make tailscale stream exposure atomic

Preserve configured public Tailscale prefixes when mapping realtime and streaming routes, and roll back the full route set when any mount fails. The CLI now uses the same transactional setup path and reports failure instead of accepting a partial exposure.

* fix(voice-call): expose Twilio's configured streaming path

Keep realtime routes under the public webhook prefix they advertise, while mounting streaming.streamPath exactly as Twilio emits it. This preserves the canonical public-to-local route list without expanding the provider API outside the scoped repair.
2026-08-17 18:10:45 -07:00

9.1 KiB

summary, read_when, title
summary read_when title
CLI reference for `openclaw voicecall` (voice-call plugin command surface)
You use the voice-call plugin and want every CLI entry point
You need flag tables and defaults for setup, smoke, call, continue, speak, dtmf, end, status, tail, latency, expose, and start
Voicecall

openclaw voicecall

voicecall is a plugin-provided command. It only appears when the voice-call plugin is installed and enabled.

When the Gateway is running, operational commands (call, start, continue, speak, dtmf, end, status) route to that Gateway's voice-call runtime. If no Gateway is reachable, they fall back to a standalone CLI runtime.

Subcommands

openclaw voicecall setup    [--json]
openclaw voicecall smoke    [-t <phone>] [--message <text>] [--mode <m>] [--yes] [--json]
openclaw voicecall call     -m <text> [-t <phone>] [--mode <m>]
openclaw voicecall start    --to <phone> [--message <text>] [--mode <m>]
openclaw voicecall continue --call-id <id> --message <text>
openclaw voicecall speak    --call-id <id> --message <text>
openclaw voicecall dtmf     --call-id <id> --digits <digits>
openclaw voicecall end      --call-id <id>
openclaw voicecall status   [--call-id <id>] [--json]
openclaw voicecall tail     [--file <path>] [--since <n>] [--poll <ms>]
openclaw voicecall latency  [--file <path>] [--last <n>]
openclaw voicecall expose   [--mode <m>] [--path <p>] [--port <port>] [--serve-path <p>]
Subcommand Description
setup Show provider and webhook readiness checks.
smoke Run readiness checks; place a live test call only with --yes.
call Initiate an outbound voice call.
start Alias for call with --to required and --message optional.
continue Speak a message and wait for the next response.
speak Speak a message without waiting for a response.
dtmf Send DTMF digits to an active call.
end Hang up an active call.
status Inspect active calls (or one by --call-id).
tail Tail calls.jsonl (useful during provider tests).
latency Summarize turn-latency metrics from calls.jsonl.
expose Toggle Tailscale serve/funnel for the webhook endpoint.

Setup and smoke

setup

Prints human-readable readiness checks by default. Pass --json for scripts.

openclaw voicecall setup
openclaw voicecall setup --json

smoke

Runs the same readiness checks. Places a real phone call only when both --to and --yes are present.

Flag Default Description
-t, --to <phone> (none) Phone number to call for a live smoke.
--message <text> OpenClaw voice call smoke test. Message to speak during the smoke call.
--mode <mode> notify Call mode: notify or conversation.
--yes false Actually place the live outbound call.
--json false Print machine-readable JSON.
openclaw voicecall smoke
openclaw voicecall smoke --to "+15555550123"        # dry run
openclaw voicecall smoke --to "+15555550123" --yes  # live notify call
For external providers (`plivo`, `telnyx`, `twilio`), `setup` and `smoke` require a public webhook URL from `publicUrl`, a tunnel, or Tailscale exposure. A loopback or private serve fallback is rejected because carriers cannot reach it.

Call lifecycle

call

Initiate an outbound voice call.

Flag Required Default Description
-m, --message <text> yes (none) Message to speak when the call connects.
-t, --to <phone> no config toNumber E.164 phone number to call.
--mode <mode> no conversation Call mode: notify (hang up after message) or conversation (stay open).
openclaw voicecall call --to "+15555550123" --message "Hello"
openclaw voicecall call -m "Heads up" --mode notify

start

Alias for call with a different default flag shape.

Flag Required Default Description
--to <phone> yes (none) Phone number to call.
--message <text> no (none) Message to speak when the call connects.
--mode <mode> no conversation Call mode: notify or conversation.

continue

Speak a message and wait for a response.

Flag Required Description
--call-id <id> yes Call ID.
--message <text> yes Message to speak.

speak

Speak a message without waiting for a response.

Flag Required Description
--call-id <id> yes Call ID.
--message <text> yes Message to speak.

dtmf

Send DTMF digits to an active call.

Flag Required Description
--call-id <id> yes Call ID.
--digits <digits> yes DTMF digits (for example ww123456# for waits).

end

Hang up an active call.

Flag Required Description
--call-id <id> yes Call ID.

status

Inspect active calls.

Flag Default Description
--call-id <id> (none) Restrict output to one call.
--json false Print machine-readable JSON.
openclaw voicecall status
openclaw voicecall status --json
openclaw voicecall status --call-id <id>

Logs and metrics

tail

Tail the voice-call JSONL log. Prints the last --since lines on start, then streams new lines as they are written.

Flag Default Description
--file <path> resolved from plugin store Path to calls.jsonl.
--since <n> 25 Lines to print before tailing.
--poll <ms> 250 (minimum 50) Poll interval in milliseconds.

latency

Summarize turn-latency and listen-wait metrics from calls.jsonl. Output is JSON with recordsScanned, turnLatency, and listenWait summaries.

Flag Default Description
--file <path> resolved from plugin store Path to calls.jsonl.
--last <n> 200 (minimum 1) Number of recent records to analyze.

Exposing webhooks

expose

Enable, disable, or change the Tailscale serve/funnel configuration for the voice webhook. When realtime or streaming audio is enabled, the command also exposes or clears that mode's WebSocket stream path.

Flag Default Description
--mode <mode> funnel off, serve (tailnet), or funnel (public).
--path <path> config tailscale.path or --serve-path Tailscale path to expose.
--port <port> config serve.port or 3334 Local webhook port.
--serve-path <path> config serve.path or /voice/webhook Local webhook path.
openclaw voicecall expose --mode serve
openclaw voicecall expose --mode funnel
openclaw voicecall expose --mode off
Only expose the webhook endpoint to networks you trust. Prefer Tailscale Serve over Funnel when possible.