跳到正文

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 接入

文档与代码在同一仓库维护,现有 Markdown 是唯一内容源。