将 Exotel 的 SIP中继接入 Retell AI,本质上是把印度的 PSTN 电话网络与 Retell 的 Voice AI 代理连接起来。整个配置分为**出站(Retell 拨打电话)** 和**入站(用户拨打电话)** 两个方向,核心难点在于印度 TRAI 的媒体锚定要求和 Exotel 的认证机制选择。
在开始配置之前,必须完成 Exotel 账户的 **KYC 验证和账户升级**。未完成 KYC 的账户无法使用 vSIP(虚拟 SIP 中继)服务。
你需要从 Exotel 控制台获取以下凭证:
| 凭证 | 说明 |
|---|---|
| API_KEY + API_TOKEN | 用于 HTTP Basic Auth 认证 |
| ACCOUNT_SID | Exotel 账户唯一标识 |
| Exophone (DID) | 已购买的印度本地号码 |
Exotel 的印度区域 API 基地址为 `api.in.exotel.com`。所有 Trunk 配置 API 的速率限制为 **200 请求/分钟**。
这是接入 Retell AI 时最容易踩坑的地方。**Retell AI 的出口 IP 是动态的**,运行在共享的 AWS/GCP 基础设施上,没有固定的静态 IP。
| 认证方式 | 适用场景 | 对 Retell 的适用性 |
|---|---|---|
| Digest 认证 | 云 Voice AI 平台、动态 IP | ✅ 推荐,Exotel 官方推荐用于 Retell、ElevenLabs、LiveKit |
| IP 白名单(ACL) | 本地 PBX、固定 IP | ❌ 仅支持 /32 单 IP,不支持 CIDR 范围 |
**核心规则**:Exotel 的 Trunk ACL **仅支持单个静态 IP(mask: 32)**,不支持 CIDR 范围。如果 Retell 提供的是 IP 范围,不要尝试在 Exotel 上白名单范围,应**使用 Digest 认证**。
出站配置:Retell → Exotel → PSTN
出站流程让 Retell 的 AI 代理通过 Exotel 的印度号码拨打印度用户。
第一步:创建 Trunk
```bash
curl -s -X POST "https://${API_KEY}:${API_TOKEN}@api.in.exotel.com/v2/accounts/${ACCOUNT_SID}/trunks" \
-H "Content-Type: application/json" \
-d '{
"trunk_name": "retell_trunk",
"nso_code": "ANY-ANY",
"domain_name": "'"${ACCOUNT_SID}"'.pstn.exotel.com"
}'
```
保存响应中的 `trunk_sid`。
第二步:映射 DID
```bash
curl -s -X POST "https://${API_KEY}:${API_TOKEN}@api.in.exotel.com/v2/accounts/${ACCOUNT_SID}/trunks/${TRUNK_SID}/phone-numbers" \
-H "Content-Type: application/json" \
-d '{"phone_number": "+91XXXXXXXXXX"}'
```
第三步:创建 Digest 凭证
```bash
curl -s -X POST "https://${API_KEY}:${API_TOKEN}@api.in.exotel.com/v2/accounts/${ACCOUNT_SID}/trunks/${TRUNK_SID}/credentials" \
-H "Content-Type: application/json" \
-d '{
"user_name": "SIP_USER",
"password": "SIP_PASS",
"friendly_name": "retell_voice_ai"
}'
```
保存 `credential id`,后续可能需要用于轮换。
第四步:在 Retell 导入号码
在 Retell 控制台进入 **Phone Numbers → Import Number**,填写:
| 字段 | 值 |
|---|---|
| Termination SIP URI | sip:<trunk_sid>@in.voip.exotel.com:5070;transport=tcp |
| SIP Trunk User Name | 上面创建的 user_name |
| SIP Trunk Password | 上面创建的 password |
**重要提示**:Exotel 的 SIP 边缘地址为 **TCP: `in.voip.exotel.com:5070`** 或 **TLS: `in.voip.exotel.com:443`**。使用 Exotel 分配给你的确切地址。
在保存前,点击 **Test SIP Connection** 验证连通性。Retell 会发送 SIP OPTIONS 请求测试连接,如果返回 SIP 2xx 响应则成功。
入站配置:PSTN → Exotel → Retell
入站流程让印度用户拨打你的 Exotel 号码时,通话路由到 Retell 的 AI 代理。
第一步:配置 Destination URI
```bash
curl -s -X POST "https://${API_KEY}:${API_TOKEN}@api.in.exotel.com/v2/accounts/${ACCOUNT_SID}/trunks/${TRUNK_SID}/destination-uris" \
-H "Content-Type: application/json" \
-d '{
"destinations": [
{"destination": "sip.retellai.com:5060;transport=tcp"}
]
}'
```
Retell 的 SIP 服务器地址是 **`sip:sip.retellai.com`**,这是 Retell 唯一的 SIP 地址,用于入站 Origination URI。Retell 支持 `transport=tcp` 或 `transport=tls`。
第二步:创建 Exotel Flow 并连接 Trunk
入站通话需要通过 **Exotel Flow** 路由。创建一个 Flow,添加 **Connect Applet**,在 **Dial whom** 字段中输入:
```
sip:
```
**注意**:这里只填 `trunk_sid` 并加上 `sip:` 前缀,**不要填完整的 URI**。Exotel 文档明确说明了这一格式要求。
第三步:将 DID 绑定到 Flow
在 Exotel 控制台将你的 Exophone(印度号码)绑定到刚创建的 Flow。完整的入站通话路径为:
```
PSTN → Exotel → DID → Flow(Connect Applet) → SIP Trunk → Destination URI → Retell
```
这是接入印度市场不可绕过的监管要求。TRAI 规定:**涉及印度 PSTN 的通话,SIP 信令和 RTP 媒体流都必须锚定在印度境内**。
Retell AI 本身**不在印度部署基础设施**,这意味着 Retell 的 AI 代理**无法直接处理印度通话**。Exotel 的 vSIP 中继作为印度本地的 PSTN 接入层,将印度通话锚定在 Exotel 的印度网络内,但**媒体流最终需要路由到 Retell 进行处理**——这仍然存在合规风险。
**实际操作建议**:与 Exotel 支持团队确认你的具体使用场景是否满足媒体锚定要求。部分企业选择在印度本地部署媒体处理节点,或使用支持印度区域部署的 Voice AI 平台(如 LiveKit 的区域固定功能)。
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 连接测试失败 (401/407) | 凭证错误 | 检查 user_name 和 password 是否与 Exotel 创建的一致 |
| 连接测试失败 (403) | IP 限制 | 检查是否误开了 IP 白名单,或 Exotel 账户状态异常 |
| 出站呼叫失败 | Termination URI 错误 | 确认 trunk_sid 和 in.voip.exotel.com 地址正确 |
| 入站呼叫不接通 | Flow 配置错误 | 检查 Connect Applet 的 Dial whom 是否为 sip:<trunk_sid> |
| 没有响应 | 防火墙/端口问题 | 确认 UDP 10000-40000 端口开放用于 RTP |
将 Exotel SIP 中继接入 Retell AI 的核心步骤可以概括为 **“出站三件套 + 入站两步走”**:
**出站**:创建 Trunk → 映射 DID → 创建 Digest 凭证 → 在 Retell 导入号码
**入站**:配置 Destination URI 指向 `sip.retellai.com` → 创建 Flow 并绑定 DID
**最关键的两个决策**:
1. **认证方式**:使用 **Digest 认证**,因为 Retell 没有静态 IP,Exotel 的 ACL 不支持 CIDR 范围
2. **媒体锚定**:与 Exotel 确认印度合规要求,Retell 本身不在印度部署,可能需要额外的本地媒体处理方案