外观
HTTP 与运行时接口
外呼 API
HTTP 接口:
text
POST /outbound-calls
Content-Type: application/json请求体:
json
{
"destinationNumber": "13800138000",
"businessCode": "default-call-business",
"callerIdNumber": "10086",
"callerIdName": "AI Bot",
"variables": {
"customer_id": "c001",
"campaign": "may-test"
},
"dialStringTemplate": "sofia/gateway/local-freeswitch-internal/{{destinationNumber}}"
}返回体:
json
{
"ok": true,
"requestId": "uuid",
"replyText": "+OK ...",
"destinationNumber": "13800138000"
}字段说明:
destinationNumber(必填):被叫号码businessCode(可选):会被写入 FreeSWITCH 通道变量business_code, 回拨进入 ESL 后按business_code优先路由业务callerIdNumber/callerIdName(可选):覆盖origination_caller_id_*variables(可选):透传到 ESL 会话的额外通道变量dialStringTemplate(可选):覆盖config.freeswitch.originateDialStringTemplate, 必须包含占位符
运行时配置接口
同一个 HTTP 端口(默认 9912)还暴露两个运行时配置端点:
text
GET /runtime-configs
→ {
"ok": true,
"data": {
"tts": { "value": { ... }, "source": "config-file" | "database" },
"recording": { "value": { ... }, "source": "config-file" | "database" },
"asr": { "wsUrl": "ws://127.0.0.1:10096/audio", "source": "config-file" }
}
}
POST /runtime-configs/reload
→ { "ok": true, "data": { "reloadedAt": "<ISO 时间>" } }GET /runtime-configs 返回的是 当前进程内实际生效 的 tts / recording 快照,以及当前进程正在使用的默认 asr.wsUrl,而不是重新查库后临时拼装的结果:
source = "database":该节当前由callflow.callflow_runtime_configs覆盖source = "config-file":该节当前仍使用config.json默认值asr.source固定为config-file,因为当前 ASR 默认地址取自audioFork.wsUrl,不走数据库覆盖
POST /runtime-configs/reload 会重新从 callflow.callflow_runtime_configs 表读取 tts / recording 两组运行时配置,覆盖静态 config.json,对随后接入的新通话立即生效,无需重启服务。 多实例部署时任一实例被调 reload 后,会向 Redis 频道 {keyPrefix}:runtime-configs:reload 广播,其余实例订阅后自行重载——管理端只需调一次,全部实例同步生效。 callflow-server 管理台在读取数据库缺省值时,也会优先请求这里的 GET /runtime-configs,以便和 callflow-esl 当前文件默认值保持一致;真正执行热生效时仍通过 reload 端点完成。处理逻辑见 src/http/runtime-config-server.ts。
同一端口还提供 GET /health(公开、不走 token 鉴权),返回 { ok: true, data: { activeSessions } }——当前进程活跃的 ESL outbound 会话数, 供负载均衡探活与 callout-server 派发层容量参考。
实时盯屏控制由 callout-server 按通话所属 cell 调用以下内部端点(均走共享 token 鉴权):
POST /live-call-sessions/:sessionKey/intervene:写入待消费的人工介入请求;POST /live-call-sessions/:sessionKey/intervention/cancel:仅发起人原子取消尚未消费的请求, 若业务已消费并进入转接则返回 409;POST /live-call-sessions/:sessionKey/hangup:写入幂等的NORMAL_CLEARING挂断信号, 由实际持有客户通道的业务实例执行,随后沿用正常结果回写与会议清理流程。
同一端口还承载浏览器软电话的内部端点(/softphone-sessions*,由 src/runtime/browser-softphone-session-hub.ts 支撑):这组接口不面向外部调用方,由 callout-server 按其 callflowEsl.baseUrl 代理访问;完整链路见 浏览器软电话与坐席 SIP 接入。