--- summary: "Webhook 安全选项和 CLI、代理工具和网关 RPC 表面" read_when: - "您将代理或隧道放在语音 Webhook 前面" - "您正在查找语音呼叫 CLI 命令" - "您正在通过网关 RPC 或座席工具拨打语音电话" title: "语音通话安全和接口" sidebarTitle: "安全性和接口" --- Webhook 签名和转发标头安全性,以及 CLI、代理工具和网关 RPC 表面。 [语音通话插件](/plugins/voice-call)指南的一部分。 ## Webhook 安全 当代理或隧道位于网关前方时,插件会重建用于签名验证的公共 URL。以下选项用于控制哪些转发头被信任: 允许来自转发头的主机白名单。 在没有白名单的情况下信任转发头。 仅当请求的远程 IP 与列表匹配时才信任转发头。 其他保护措施: - 对于 Twilio、Telnyx 和 Plivo,Webhook **重放防护**已启用。重放的有效 Webhook 请求会被确认,但会跳过副作用处理。 - Twilio 对话回合在 `` 回调中包含每回合令牌,因此 stale/replayed 语音回调无法满足较新的待处理转录回合。 - 当提供方所需的签名头缺失时,未认证的 Webhook 请求会在读取正文之前被拒绝。 - 语音通话 Webhook 在签名验证之前使用共享的预认证正文读取配置文件(最大 64 KB 正文、5 秒读取超时),并为每个密钥设置进行中的请求上限(默认每个密钥 8 个并发请求)。 具有稳定公共主机的示例: ```json5 { plugins: { entries: { "voice-call": { config: { publicUrl: "https://voice.example.com/voice/webhook", webhookSecurity: { allowedHosts: ["voice.example.com"], }, }, }, }, }, } ``` ## CLI ```bash openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw" openclaw voicecall start --to "+15555550123" # alias for call openclaw voicecall continue --call-id --message "Any questions?" openclaw voicecall speak --call-id --message "One moment" openclaw voicecall dtmf --call-id --digits "ww123456#" openclaw voicecall end --call-id openclaw voicecall status --call-id openclaw voicecall tail openclaw voicecall latency # summarize turn latency from logs openclaw voicecall expose --mode funnel ``` 当网关已在运行时,可操作的 `voicecall` 命令将委托给网关拥有的语音呼叫运行时,因此 CLI 不会绑定第二个 Webhook 服务器。如果没有可访问的网关,命令将回退到独立的 CLI 运行时。打印调用结果后,该进程将继续为其 Webhook 提供服务,直到 SIGINT 或 SIGTERM。关闭会在关闭其资源之前加入运行时创建、接受的命令工作以及挂起的收割机挂起。 `latency` 默认从 SQLite 读取持久化的通话记录。使用 `--file ` 读取现有的自定义 JSONL 日志(基本名称不是 `calls.jsonl`),并使用 `--last ` 将分析限制为最后 N 条记录(默认 200 条)。输出包括 min/max/avg、p50 和 p95,用于表示轮次延迟和监听等待时间。 语音呼叫 JSONL 日志已停用 7 月前的状态。通过OpenClaw 2026.9.7升级,并运行`openclaw doctor --fix`将其导入到SQLite中,然后再更新。该版本将呼叫数据、事件排序和原始日志保留为 `calls.jsonl.migrated`。 Current Doctor 保留任何剩余源并报告中间升级;运行时仅读取当前的 SQLite 格式。 呼叫保留创建时选择的座席。更改配置的代理会影响新呼叫。即使会话密钥指定了代理,也不会自动恢复没有显式 `agentId` 的较旧活动记录。他们存储的行和转录本保持不变;挂断提供商处剩余的所有呼叫并开始新的呼叫。完整的历史记录在没有代理所有者的情况下仍然可读。 ## 代理工具 工具名称:`voice_call`。 | 操作 | 参数 | | --------------- | ------------------------------------------ | | `initiate_call` | `message`, `to?`, `mode?`, `dtmfSequence?` | | `continue_call` | `callId`, `message` | | `speak_to_user` | `callId`, `message` | | `send_dtmf` | `callId`, `digits` | | `end_call` | `callId` | | `get_status` | `callId` | voice-call 插件附带一个匹配的智能体技能。 ## 网关 RPC | 方法 | 参数 | 笔记 | | --------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------- | | `voicecall.initiate` | `to?`, `message`, `mode?`, `sessionKey?`, `requesterSessionKey?` | 当省略 `to` 时,回退到 `toNumber` 配置。 | | `voicecall.start` | `to`, `message?`, `mode?`, `dtmfSequence?`, `sessionKey?` | 与 `initiate` 相同,但也接受连接前的 `dtmfSequence`。 | | `voicecall.continue` | `callId`, `message` | 阻塞直到当前轮次完成;返回转录内容。 | | `voicecall.continue.start` | `callId`, `message` | 异步版本:立即返回一个 `operationId`。 | | `voicecall.continue.result` | `operationId` | 轮询一个待处理的 `voicecall.continue.start` 操作以获取结果。 | | `voicecall.speak` | `callId`, `message` | 立即播放而不等待;在 `realtime.enabled` 时使用实时桥接。 | | `voicecall.dtmf` | `callId`, `digits` | | | `voicecall.end` | `callId` | | | `voicecall.status` | `callId?` | 省略 `callId` 可列出所有活动通话。 | `dtmfSequence` 仅在 `mode: "conversation"` 时有效;notify 模式的通话如果需要在连接后发送按键,应在通话建立后使用 `voicecall.dtmf`。