TelCRM(国信)呼叫中心 集成 API 文档 — 大模型故障上报与恢复(knServer 专用)

面向 knServer(大模型网关)侧的对接开发人员。knServer 通过本文的两个 JSON 接口向呼叫中心成对上报大模型故障与恢复;呼叫中心据此在故障期间阻止呼叫进入机器人(排队自动触发与排队确认"按2转机器人"两个入口),恢复后自动放行。

版本前提:本契约自 system.version 3.8.680 起生效;部署现场需已安装含本特性的构建并重启(以控制台"启动成功"日志时间晚于 2026-09-13 为准)。

对接是拦截效果的上线硬前提 只报故障不报恢复时,一次故障上报 = 两个机器人入口持续拦截,直到恢复上报、意图预测自愈或呼叫中心重启。请务必先完成成对上报再依赖拦截能力。

1. 接口总览

接口opt方向用途
大模型故障上报emergency.voice.warnknServer → 呼叫中心大模型故障时上报:记录故障状态 + 发布系统告警 + 向告警组播放紧急语音
大模型恢复上报ai.model.recoverknServer → 呼叫中心大模型恢复时上报:清除故障状态 + 恢复系统告警 + 放行机器人入口(不放音)

两接口共用同一通道:

URL:  http://{cti_host}:12121/bridge/jsoncfg?opt=<opt>&json=<URL编码的JSON>
方法: GET 或 POST

2. 通用约定(两接口一致)

2.1 鉴权(由 /bridge/jsoncfg 容器统一处理)

  • IP 白名单(legitimate.servlet.client.ip.prefix)或 Basic Auth(legitimate.servlet.basic.auth)任一配置即启用;
  • 127.0.0.1 本机调用恒放行;
  • 两者都未配置时降级为全开放(服务端打 warn 日志)——生产环境请至少配置其一。

2.2 响应码(业务码在响应体,HTTP 状态码恒为 200)

响应体为纯文本,与 /bridge/callctrl 系列同风格:

响应体含义
200请求被接受(幂等,重复调用无害)
400请求体校验失败(如故障上报的 voiceKey 为空,或防御性类型校验失败)
420请求体 JSON 反序列化失败(容器统一行为,不会进入业务处理)

不要用 HTTP 层判断成败,解析响应体文本。

2.3 engine 字段规约(两接口共用)

项规约
类型字符串,可选
语义大模型引擎名(如 GLM-4),用于系统告警文案(#ENGINE 参数)与日志
清洗服务端自动截断到 64 字符并滤除控制字符(含换行)——超长/含控制字符的值不会报错,但告警与日志按清洗后文本呈现
缺省故障上报:缺省 = 通用紧急放音,不置大模型故障状态(见 §3.2);恢复上报:缺省 = 整体恢复,清除全部故障状态

3. 接口一:大模型故障上报

URL:  http://{cti_host}:12121/bridge/jsoncfg?opt=emergency.voice.warn&json=<JSON>
JSON: {"voiceKey": "<语音配置键>", "engine": "<大模型引擎名>"}

3.1 请求字段

字段必填说明
voiceKey是紧急放音的语音配置键(对应呼叫中心 service.properties 中的语音文件名,如 emergency.large.model.fault.voice)。为空时返回 400 且不置任何状态;非空但未配置对应语音文件时返回 200 且照常置状态,仅放音静默跳过
engine大模型场景必带大模型引擎名。非空才会被识别为大模型故障上报(置故障状态+转换式告警+拦截机器人入口);空 = 通用紧急放音,与大模型无关

3.2 服务端行为(处理顺序,对接方需知)

voiceKey 为空?            ──是──▶ 返回 400,什么都不做
engine 非空?              ──是──▶ 记录大模型故障状态(★在放音限流之前,永不被限流跳过)
                                   首次故障:发布系统告警 WARN_AI_MODEL_FAILURE(#ENGINE=engine)
                                   已在故障中:只更新文案,不重复发告警
1小时内同 voiceKey 重复?   ──是──▶ 跳过放音,返回 200(★状态已更新,不受影响)
播放紧急语音到告警组       ──(无在线告警目标/未配置语音文件时静默跳过,仍 200)

关键点:放音去重(1 小时/voiceKey)只作用于语音播放,不作用于故障状态记录——抖动型故障(故障→恢复→1 小时内再故障)的第二次上报即使被限流跳过放音,状态与告警也照常生效。

3.3 示例

# 大模型故障上报(带 engine = 大模型语义)
curl "http://{cti_host}:12121/bridge/jsoncfg?opt=emergency.voice.warn&json=%7B%22voiceKey%22%3A%22emergency.large.model.fault.voice%22%2C%22engine%22%3A%22GLM-4%22%7D"
# 响应体: 200

# 通用紧急放音(engine 缺省,不碰大模型状态)——knServer 正常情况下不用这个形态
curl "http://{cti_host}:12121/bridge/jsoncfg?opt=emergency.voice.warn&json=%7B%22voiceKey%22%3A%22emergency.fire.alarm%22%7D"
# 响应体: 200

# 错误示例:voiceKey 为空(带 engine 也一样)→ 400,不置状态
curl "http://{cti_host}:12121/bridge/jsoncfg?opt=emergency.voice.warn&json=%7B%22engine%22%3A%22GLM-4%22%7D"
# 响应体: 400

4. 接口二:大模型恢复上报

URL:  http://{cti_host}:12121/bridge/jsoncfg?opt=ai.model.recover&json=<JSON>
JSON: {"engine": "<大模型引擎名>"}   ← engine 可选

4.1 请求字段

字段必填说明
engine否仅用于日志。带不带都清除全部故障状态(整体恢复语义:呼叫中心按"knServer 网关级"建模,引擎选择权在 knServer 侧)

4.2 服务端行为

清除大模型故障状态
  ├─ 之前处于故障中:发布告警恢复事件(控制台 WARN_AI_MODEL_FAILURE 转为恢复),两个机器人入口放行
  └─ 之前本来就正常:无任何副作用(幂等,重复调用/乱序调用无害)
不放音、不限流

4.3 示例

# 恢复上报(engine 缺省 = 整体恢复,推荐用法)
curl "http://{cti_host}:12121/bridge/jsoncfg?opt=ai.model.recover&json=%7B%7D"
# 响应体: 200

# 带引擎名(仅影响日志,效果同上)
curl "http://{cti_host}:12121/bridge/jsoncfg?opt=ai.model.recover&json=%7B%22engine%22%3A%22GLM-4%22%7D"
# 响应体: 200

5. knServer 对接契约(必读)

5.1 上报时机

knServer 侧事件动作
大模型故障(任一引擎不可用/网关不可用)调 emergency.voice.warn,必须带非空 voiceKey 与非空 engine,可重试(幂等)
大模型恢复调 ai.model.recover(engine 可缺省),可重试(幂等)
重启后状态未知建议重启完成即补发一次当前真实状态(故障则报故障,正常则报恢复),双向幂等保证安全

5.2 不成对上报的后果(为什么这是硬前提)

场景后果
只报故障、漏报恢复两个机器人入口持续拦截(排队客户全部走人工),直到恢复上报或呼叫中心重启。现场应急解锁:curl "http://{cti_host}:12121/bridge/jsoncfg?opt=ai.model.recover&json=%7B%7D"(幂等无害,无需重启)
漏报故障拦截不生效,行为同旧版本(呼叫照常进入机器人,可能沟通失败占住授权名额)
呼叫中心重启故障状态归零(与 TTS/ASR 熔断计数同语义);knServer 仍故障需再上报一次(放音去重窗口也随重启清零,不会被拦)

5.3 对故障上报的补充事实

  • 放音需要现场预配置 对应的语音文件名在 service.properties 配置、.wav 置于 <confPath>/voice/ 目录、告警目标组 warn.voice.to.ext.group 已配置(或存在在线 FXS 分机)。三者缺一则放音静默跳过——但故障状态与拦截照常生效,语音只是给人听的配套广播,不是对接的依赖项。
  • 告警文案:控制台告警编号 61(大模型故障告警),参数 #ENGINE 取清洗后的 engine(缺省显示 -)。

6. 联调验收清单

#步骤预期
1健康状态下呼入排队(队列超阈值)呼叫进入机器人(与旧版一致)
2knServer 上报故障(voiceKey+engine)返回 200;控制台出现 61 号告警(#ENGINE 正确);新排队呼叫不再进入机器人,继续排队等人工;排队中按 2 重播等待提示、不转机器人
31 小时内再报一次故障返回 200;语音不再播(去重);状态与告警不变
4knServer 上报恢复返回 200;控制台 61 号告警转为恢复;新呼叫恢复进入机器人
5上报故障(engine 非空但 voiceKey 为空)返回 400;不置故障状态、不拦截(用于验证 knServer 侧参数校验)
6通用紧急放音(engine 空)正常放音与告警,不置大模型状态、不影响机器人入口
7(可选)大模型故障期间,若现场已配置意图预测 URL 且预测成功状态自动清除、告警自动恢复(自愈);未配置预测 URL 的现场无此流量,恢复完全依赖接口二

7. 常见问题

Q:两个接口的 JSON 里字段名大小写敏感吗? A:敏感。必须精确使用 voiceKey、engine(Gson 按字段名反序列化,不匹配等同字段缺省)。

Q:故障上报后多久拦截生效? A:即时。状态是进程内内存标志,上报成功(收到 200)的下一个排队触发即被拦截。已进入机器人沟通中的呼叫不受影响,只拦新进入。

Q:恢复上报需要与故障上报的 engine 一致吗? A:不需要。恢复是整体语义,任何恢复调用(带任意 engine 或不带)都清除全部故障状态。

Q:engine 名变了(如 GLM-4 → GLM-4.5)会影响恢复吗? A:不会,同上一条——不存在按引擎名配对的隐含契约。

Q:HTTP 层返回 401/403 是怎么回事? A:jsoncfg 容器鉴权未通过(IP 白名单/BasicAuth)。knServer 所在服务器需加入 legitimate.servlet.client.ip.prefix 白名单,或改用 Basic Auth;本机(127.0.0.1)调用不受限。


契约事实源:PbxBusiness/src/com/pbxbusiness/voicewarn/json/JsonEmergencyVoiceWarn.java(类头 javadoc 与实现)、AiModelRecoverReq.java、EmergencyVoiceWarnReq.java、com.pbxbusiness.voicewarn.AiModelFaultState(单布尔网关级状态机);设计文档 docs/superpowers/specs/2026-09-13-robot-entry-ai-health-gate-design.md。本文与实现冲突时,以源码为准。