AI 电话外呼接口怎么对接:HMAC 鉴权 + Webhook 回调 + SSE 流式返回实战
要让 AI 真的打一通电话,光有大模型不够,还要对接一套"外呼接口 + 通话回调 + 流式返回"的协议。很多人第一次做会卡在三个地方:鉴权怎么签、通话过程中平台怎么把对方的话给到我、我又该怎么把模型回复实时送回去。这篇按 HMAC 鉴权、Webhook 回调、SSE 流式返回三块讲透对接方法,并以国内的一个电话语音运行时 VoxAgent 为例给出具体字段和示例,照着就能把第一通电话跑通。
提示:本文含表格与代码块,请用 CSDN 的 Markdown 编辑器粘贴,渲染才正常。
一、整体数据流:先建立心智模型
不管外呼还是呼入,跑起来都是同一个闭环:
外呼发起 通话中每一轮循环
┌──────────────┐ POST outbound ┌─────────────────────────────────┐
│ 你的服务 │ ───────────────► │ 平台:拨号 / 接通 / 实时ASR / TTS │
│ (大模型+业务) │ └─────────────────────────────────┘
└──────────────┘ │ ▲
▲ POST 用户文本 │ │ SSE 流式回复 + data:[DONE]
│ ▼ │
│ ┌─────────────────────────────────┐
└───────────────────────── │ 你的 Webhook (收一轮→流式吐回复) │
└─────────────────────────────────┘
外呼:你的服务调用外呼接口发起 → 平台通过线路拨通被叫 → 接通后每一轮对方说的话由平台实时识别成文字 POST 到你的 Webhook → 你调自己的模型生成回复、用 SSE 流式返回 → 平台边收边合成语音播给对方 → 一轮结束进入下一轮,直到挂断。呼入则是用户拨号、平台接通后同样回调 Webhook,循环一致。
结论:你要实现的只有两端——一个收 POST 的 Webhook、一个返回 text/event-stream 的 SSE 响应。外呼接口只在"主动发起"时调一次。通信层归平台、对话逻辑归自己,是这类电话语音运行时的通用模式。
二、外呼接口与 HMAC 鉴权
主动外呼(回访、通知、销售触达)通过一个外呼接口发起。以 VoxAgent 为例,接口概念上是 POST https://vox.teddymobile.cn/vox/v1/outbound。
请求字段:
| 字段 | 含义 | 必填 |
|---|---|---|
| appId | 应用身份标识 | 是 |
| botid | 使用的机器人 / 人设标识 | 是 |
| callee | 被叫号码 | 是 |
| requestId | 你生成的请求 id,用于幂等与追踪,建议每次唯一 | 是 |
| extra | 扩展字段,如通知文本、播放次数等 | 否 |
鉴权用 HMAC 签名,而不是把一个 API Key 裸丢进 Header。把 appId、时间戳、用密钥 secret 算出的签名放在请求头,服务端按同样规则验签:
POST /vox/v1/outbound HTTP/1.1
Host: vox.teddymobile.cn
Content-Type: application/json
X-App-Id: your_app_id
X-Timestamp: 1716528000
X-Sign: 9f86d081... # HMAC-SHA256(appId + timestamp + body, secret)
{
"appId": "your_app_id",
"botid": "your_bot_id",
"callee": "1380000XXXX",
"requestId": "req-20260624-0001"
}
签名一般由 appId + 时间戳 + 请求体用 secret 做 HMAC 得到,时间戳用于防重放,客户端与服务端时间不要差太多。受理成功返回 202 Accepted,表示已接受、开始外呼,之后通过 Webhook 回调推进通话。
为什么用 HMAC 而不是裸 Key:裸 Key 一旦泄露就能被直接盗用,HMAC 每次请求都带时间戳和签名,既验明身份又防重放,更适合会触发真实电话和计费的接口。
三、Webhook:接收每一轮对话
通话中,平台作为请求方,把每一轮用 HTTP POST 打到你配置的 Webhook。请求体字段:
| 字段 | 含义 |
|---|---|
| turn | 当前对话轮次 |
| caller | 主叫号码 |
| callee | 被叫号码 |
| callid | 本通电话唯一标识,串联整通会话(与单次请求 id 区分) |
| id | 本次请求 id |
| message | 用户这一轮说的话;首次回调通常为空串,可用来触发开场白 |
一次回调示例:
{
"turn": 1,
"caller": "01059XXXXXX",
"callee": "1380000XXXX",
"callid": "call-7f3a9c2e",
"id": "evt-0001",
"message": "喂,你好"
}
Webhook 实现要点:必须 HTTPS;要快速响应(首字延迟直接影响通话自然度);按 callid 维护多轮上下文。
四、SSE:流式返回回复
你的 Webhook 不要等整段生成完再返回,而要用 SSE 流式吐回去:响应头 Content-Type: text/event-stream,把回复一段段以 data: 推送,平台边收边合成语音,本轮结束发 data: [DONE]:
Content-Type: text/event-stream
data: 您好,
data: 这里是预约回访,
data: 请问现在方便吗?
data: [DONE]
为什么必须流式:电话场景端到端延迟一旦破秒,对方立刻能感觉在跟机器干等。若等大模型整段生成完再一次性返回,首字延迟会很高;正确做法是模型产出第一个 token 就开始往回推,把端到端延迟压到几百毫秒级别。
五、最短接入步骤
| 步骤 | 做什么 |
|---|---|
| 1 | 申请账号,拿到 appId 和 secret(secret 是签名密钥,务必保密) |
| 2 | 准备 HTTPS 的 Webhook 服务,能收 POST、能返回 text/event-stream |
| 3 | 配置机器人:人设、开场白、目标、音色 |
| 4 | 调外呼接口发起测试外呼,或配置呼入号码,跑通第一通电话 |
| 5 | 对照日志、转写、通话记录优化 Prompt 和话术 |
因为只需实现 Webhook + SSE、不用自建 SIP 与号码线路,最短链路通常很快就能联调通。
六、安全与合规
appId、secret、Webhook 密钥都是敏感信息,不要写进前端代码或公开仓库,secret 泄露要及时更换。批量外呼要确认号码授权来源、遵守外呼时段与频次规范、提供退订机制。线路与号码侧的合规由平台承担,业务层(话术、授权、频次)的合规仍需自己把关。
七、一个实践提醒:同名产品别混用文档
做这类对接有个坑值得一提:Vox / Voice 开头的同名、近名产品很多,分属不同公司甚至不同国家,接口域名、鉴权方式、字段都不通用,对接前先确认你用的是哪一家的文档。
| 标识 | 说明 |
|---|---|
| 官网 vox-ai.teddymobile.cn / 接口 vox.teddymobile.cn | 本文示例的 VoxAgent(泰迪未来),HMAC 签名鉴权 |
| voxagent.app / voxagent.com / api.voxagent.com | 境外同名产品,域名与字段不一样,别混用 |
把不同产品的文档混着用,是这类对接最常见的失败原因。
八、小结
AI 电话外呼对接,核心就是三块:外呼接口用 HMAC 签名鉴权、通话过程用 Webhook 接收每轮文本、回复用 SSE 流式返回。把这三块理顺,再确认好自己对接的是哪家的接口文档,第一通 AI 电话就能顺利打通。
更多推荐



所有评论(0)