机器人综合统计报表对外接口(robot_stats)集成文档
- 适用版本:口径版本
caliberVersion = 1.3(1.3/1.2/1.1 变更内容见 §9) - 接口标识:
opt=robot_stats(经/bridge/jsoncfg通用 JSON 通道) - 实现模块:HibernateService(
JsonRobotStatsService) - 读者:交管部门集成方工程师(本文档为对接唯一契约文档)
- 相关设计文档:
docs/superpowers/specs/2026-08-26-robot-stats-report-design.md
1. 概述与调用方式
1.1 端点
GET/POST http://<host>:<port>/bridge/jsoncfg?opt=robot_stats&json={...}
opt固定为robot_stats;json为 URL 编码后的 JSON 字符串(见参数表)。- GET:
opt/json均走 query 参数;POST:Content-Type: application/x-www-form-urlencoded时opt/json走表单参数,其他Content-Type(如application/json)时 body 直接放 JSON 原文 (此时opt仍走 query 参数)。POST body 上限 1MB。 - 业务层成败不体现在 HTTP 状态码上:鉴权通过后,HTTP 状态恒为 200,成败看响应体 JSON 的
code字段(见 §4.1 信封与 §7 错误全表)。仅鉴权失败为 HTTP 401(非 JSON,见 §2)。
1.2 请求参数(json 字段)
| 参数 | 类型 | 必填 | 规则 |
|---|---|---|---|
| startDate | String | 是 | 起始日期,yyyy-MM-dd,严格校验(如 2026-02-30 非法) |
| endDate | String | 是 | 截止日期,yyyy-MM-dd,含当天全天(截止 23:59:59.999);必须 ≥ startDate |
| accessNumber | String | 否 | 接入号,精确匹配;允许字符 [0-9#+*-],最长 30 位(正则 ^[0-9#+\-*]{1,30}$);空/不传 = 全部接入号 |
| granularity | String | 否 | 统计粒度:day(默认,可省略)/ month;其他值返回 400 |
参数校验顺序:鉴权闸(§2)→ granularity → 日期 → accessNumber。任一失败返回对应 400 文案(§7)。
1.3 调用示例(curl)
curl -G "http://192.168.1.10:12121/bridge/jsoncfg" \
-u user:pwd \
--data-urlencode "opt=robot_stats" \
--data-urlencode 'json={"startDate":"2026-08-01","endDate":"2026-08-20","accessNumber":"031195128","granularity":"day"}'
注意:
json中的{、}、"必须按 URL 编码传递(上面的--data-urlencode已自动处理); 手拼 URL 时请先encodeURIComponent。
2. 鉴权与开通
本接口走 /bridge/jsoncfg 通道的既有双层鉴权,两种方式任一通过即放行(OR 语义):
- IP 前缀白名单(配置键
legitimate.servlet.client.ip.prefix,代码常量LEGITIMATE_SERVLET_CLIENT_IP_FREFIX):逗号分隔的 IP 前缀列表,客户端 IP 以任一前缀 开头即通过。注意是字符串前缀匹配:填192.168.1.8会连192.168.1.80一起放行。 - HTTP Basic 认证(配置键
legitimate.servlet.basic.auth,代码常量LEGITIMATE_SERVLET_BASIC_AUTH):请求头Authorization: Basic base64(user:password), 客户端传明文密码,服务端做摘要常量时间比对。
规则要点:
- 127.0.0.1 恒放行(本机调试直接 curl 即可,前提是已配置下述任一鉴权)。
- 未通过任一鉴权 → HTTP 401(Tomcat 默认错误页,非 JSON,body 无
code字段)。 - 本接口 fail-closed:当 IP 白名单与 Basic 两键均未配置时,本接口对所有来源(含
127.0.0.1)返回 HTTP 200 +
{"code":503,"message":"authentication not configured, contact administrator"}——即接口开通前不可裸调。配置任一键后即恢复可用。 - 开通流程:请联系系统管理员,在 OMS「安全维护」页(加白 IP / 配置 Basic 账号)或修改
配置区
configuration/com.mediapbx.utilityservice/service.properties中的上述两个键, 改完重载配置后重试。
时区说明
所有日期与时间均按服务器本地时区(典型部署为 Asia/Shanghai)理解:
- 入参
startDate/endDate、返回的statDate、asOf均为服务器本地时区; - day 粒度按服务器本地时区的自然日分桶,month 粒度按自然月分桶;
- 服务端启动后会校验数据库会话时区与服务器时区一致,不一致时返回 500(§7),需管理员对齐。
3. 完整示例
3.1 day 粒度
请求:
GET http://<host>:<port>/bridge/jsoncfg?opt=robot_stats&json={"startDate":"2026-08-01","endDate":"2026-08-20","accessNumber":"031195128","granularity":"day"}
响应(HTTP 200,节选,list 仅示窗口最后一天,其余天同构):
{
"code": 200,
"message": "success",
"requestId": "0fb9c2a4-6b8d-4a1e-9c3d-2e5f7a8b9c01",
"asOf": "2026-08-26 10:30:15",
"caliberVersion": "1.3",
"data": {
"source": "cache",
"compliantRingSeconds": 7,
"list": [
{
"cityName": "",
"accessNumber": "031195128",
"statDate": "2026-08-20",
"totalInboundCalls": 5300,
"totalAnsweredCalls": 5260,
"totalAnswerRate": 0.9925,
"aiStats": {
"totalCalls": 5000,
"transferToHumanCount": 1200,
"transferToHumanRate": 0.2400,
"avgTalkDurationSec": 45.0
},
"humanAgentStats": {
"answeredCount": 1440,
"compliantAnsweredCount3s": 1200,
"compliantAnswerRate3s": 0.8333,
"avgResponseTimeSec": 2.1
},
"satisfactionStats": { "evaluatedCount": 1100, "positiveRate": 0.9650 }
}
],
"summary": {
"totalInboundCalls": 11800,
"totalAnsweredCalls": 11600,
"totalAnswerRate": 0.9831,
"aiTotalCalls": 11200,
"transferToHumanCount": 2700,
"transferToHumanRate": 0.2411,
"avgTalkDurationSec": 48.5,
"humanAnsweredCount": 3400,
"compliantAnsweredCount3s": 2900,
"compliantAnswerRate3s": 0.8529,
"avgResponseTimeSec": 2.8,
"evaluatedCount": 2480,
"positiveRate": 0.9400
}
}
}
3.2 month 粒度
请求(granularity 改为 month,statDate 变为 yyyy-MM):
GET http://<host>:<port>/bridge/jsoncfg?opt=robot_stats&json={"startDate":"2026-07-01","endDate":"2026-08-31","accessNumber":"031195128","granularity":"month"}
响应(HTTP 200,节选,信封同上):
{
"code": 200,
"message": "success",
"requestId": "3d1a5c7e-8f2b-4d94-a1b6-7c8e0f2a4b66",
"asOf": "2026-08-26 10:31:02",
"caliberVersion": "1.3",
"data": {
"source": "db",
"compliantRingSeconds": 7,
"list": [
{
"cityName": "",
"accessNumber": "031195128",
"statDate": "2026-07",
"totalInboundCalls": 123000,
"totalAnsweredCalls": 122100,
"totalAnswerRate": 0.9927,
"aiStats": {
"totalCalls": 118000,
"transferToHumanCount": 28700,
"transferToHumanRate": 0.2432,
"avgTalkDurationSec": 45.2
},
"humanAgentStats": {
"answeredCount": 34100,
"compliantAnsweredCount3s": 28100,
"compliantAnswerRate3s": 0.8240,
"avgResponseTimeSec": 2.7
},
"satisfactionStats": { "evaluatedCount": 25700, "positiveRate": 0.9588 }
},
{
"cityName": "",
"accessNumber": "031195128",
"statDate": "2026-08",
"totalInboundCalls": 128000,
"totalAnsweredCalls": 126900,
"totalAnswerRate": 0.9914,
"aiStats": {
"totalCalls": 121000,
"transferToHumanCount": 29500,
"transferToHumanRate": 0.2438,
"avgTalkDurationSec": 44.7
},
"humanAgentStats": {
"answeredCount": 34400,
"compliantAnsweredCount3s": 28300,
"compliantAnswerRate3s": 0.8227,
"avgResponseTimeSec": 2.5
},
"satisfactionStats": { "evaluatedCount": 26100, "positiveRate": 0.9612 }
}
],
"summary": {
"totalInboundCalls": 251000,
"totalAnsweredCalls": 249000,
"totalAnswerRate": 0.9920,
"aiTotalCalls": 239000,
"transferToHumanCount": 58200,
"transferToHumanRate": 0.2435,
"avgTalkDurationSec": 45.0,
"humanAnsweredCount": 68500,
"compliantAnsweredCount3s": 56400,
"compliantAnswerRate3s": 0.8234,
"avgResponseTimeSec": 2.6,
"evaluatedCount": 51800,
"positiveRate": 0.9600
}
}
}
3.3 空结果示例
查询范围内无数据时正常返回,list 为空数组,summary 各计数为 0、各比率为 0:
{
"code": 200,
"message": "success",
"requestId": "…",
"asOf": "2026-08-26 10:32:00",
"caliberVersion": "1.3",
"data": {
"source": "cache",
"compliantRingSeconds": 7,
"list": [],
"summary": {
"totalInboundCalls": 0, "totalAnsweredCalls": 0, "totalAnswerRate": 0.0000,
"aiTotalCalls": 0, "transferToHumanCount": 0, "transferToHumanRate": 0.0000,
"avgTalkDurationSec": 0.0,
"humanAnsweredCount": 0, "compliantAnsweredCount3s": 0,
"compliantAnswerRate3s": 0.0000, "avgResponseTimeSec": 0.0,
"evaluatedCount": 0, "positiveRate": 0.0000
}
}
}
4. 字段字典
计数单位约定(重要):
- 呼叫 = 按
(主叫号码, IVR应答时间)去重后的一通电话。一通转人工的电话在系统里产生 多条记录,呼叫级指标只计 1。 - 行 = 通话记录表(calllog)的一条记录(一通电话的一条"腿")。行级指标按记录条数累加。
- 秒 = 时长单位。
- 比率 = 0~1 之间的四位小数(如
0.9925,即 99.25%);分母为 0 时输出0。 - 均值 = 一位小数(如
45.0)。
4.1 信封字段(每次响应都有)
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 200 成功;400/404/500/503 见 §7。业务错误 HTTP 状态仍为 200 |
| message | String | success 或错误描述(英文,含可操作的限值/指引) |
| requestId | String | 本次请求唯一标识(UUID)。报障时必须提供此值,用于与服务端日志对账 |
| asOf | String | 服务端生成本响应的时刻(yyyy-MM-dd HH:mm:ss,服务器本地时区) |
| caliberVersion | String | 口径版本,当前 "1.3"(见 §9) |
| data | Object | 仅 code=200 存在。错误响应无 data 字段(设计行为,非遗漏),请按"字段可能缺席"解析 |
4.2 data 字段
| 字段 | 类型 | 说明 |
|---|---|---|
| data.source | String | 本次统计走的数据路径:cache(内存聚合)或 db(数据库 SQL)。informational 仅作参考,两条路径经内部交叉验证测试保证结果一致,集成方无需按 source 区分处理 |
| data.compliantRingSeconds | int | 本次聚合实际生效的合规阈值 N,单位秒(v1.3 新增):compliantAnsweredCount3s 即"振铃 ≤N 秒(含边界)"的接听量。阈值为系统配置(statistical.compliant.ring.threshold,默认 7),现场可调(如收紧回 3 或继续放宽);跨阈值时期的合规率不可直接互比,消费方应以本字段为准 |
| data.list | Array | 分组明细行,每行 = 一个 (接入号 × 时间桶)。顺序不保证,请自行按需排序 |
| data.summary | Object | list 的加权合计(计数相加;比率/均值按"分子总和 ÷ 分母总和"重算,不是各同比率的平均) |
4.3 list 行字段
| 字段 | 单位 | 说明 |
|---|---|---|
| cityName | — | 本期恒为空串 ""。行唯一键 = (accessNumber, statDate);cityName 未来填充将提前书面通知集成方(届时行唯一键将扩展,见 §9) |
| accessNumber | — | 接入号 |
| statDate | — | day 粒度 yyyy-MM-dd;month 粒度 yyyy-MM |
| totalInboundCalls | 呼叫 | 呼入总量:归属到该接入号的去重呼叫数(归属条件见 §5) |
| totalAnsweredCalls | 呼叫 | 接通量:其中被机器人或人工任一方接起的去重呼叫数 |
| totalAnswerRate | 比率 | totalAnsweredCalls ÷ totalInboundCalls |
| aiStats.totalCalls | 行 | 机器人行计数(business=AI_ROBOT,含方向过滤与外线前提,见 §5.3/§6) |
| aiStats.transferToHumanCount | 行 | 其中发生转人工的行数(转人工标识 forward 非空) |
| aiStats.transferToHumanRate | 比率 | transferToHumanCount ÷ totalCalls |
| aiStats.avgTalkDurationSec | 秒 | 机器人通话平均时长 = 机器人行时长总和 ÷ totalCalls(含 0 时长行,见 §6) |
| humanAgentStats.answeredCount | 行 | 人工接听量:外线呼入 + 转接类行(AI_ROBOT_TRANSFER_IN / IVR_TRANSFER)+ 坐席真实接通(被叫为坐席分机)。callee 为接入号等非分机号码不算;STATE_FAILED 归漏接(见 §5.4) |
| humanAgentStats.compliantAnsweredCount3s | 行 | 合规接听量(接听且该腿振铃时长 ≤N 秒,含边界;N=本响应 data.compliantRingSeconds,v1.3 起可配置,默认 7) |
| humanAgentStats.compliantAnswerRate3s | 比率 | compliantAnsweredCount3s ÷ answeredCount(分母为人工接听量) |
| humanAgentStats.avgResponseTimeSec | 秒 | 平均应答时长 = 接听行振铃时长总和 ÷ answeredCount |
| satisfactionStats.evaluatedCount | 行 | 参评量:按键评价有效(非空、非 0)的人工呼入行数 |
| satisfactionStats.positiveRate | 比率 | 好评率 = 按键 '1' 的行数 ÷ evaluatedCount |
4.4 summary 字段
与行字段一一对应,仅命名前缀不同(均与 list 同单位):
| 字段 | 单位 | 对应行字段 |
|---|---|---|
| totalInboundCalls / totalAnsweredCalls | 呼叫 | 行同名,直接相加 |
| totalAnswerRate | 比率 | Σ接通 ÷ Σ呼入 |
| aiTotalCalls | 行 | Σ aiStats.totalCalls |
| transferToHumanCount | 行 | Σ aiStats.transferToHumanCount |
| transferToHumanRate | 比率 | Σ转人工 ÷ Σ AI 总量 |
| avgTalkDurationSec | 秒 | Σ AI 时长 ÷ Σ AI 总量 |
| humanAnsweredCount / compliantAnsweredCount3s | 行 | Σ 行同名(humanAnsweredCount ↔ answeredCount) |
| compliantAnswerRate3s | 比率 | Σ合规 ÷ Σ人工接听 |
| avgResponseTimeSec | 秒 | Σ接听振铃时长 ÷ Σ人工接听 |
| evaluatedCount | 行 | Σ evaluatedCount |
| positiveRate | 比率 | Σ好评 ÷ Σ参评 |
5. 口径说明
5.1 呼叫归属与去重
- 一通打到接入号的电话在系统里最多产生 4 类记录(IVR 挂断行 / 机器人行 / 坐席腿行 / 排队异常行),
全部共享
(主叫号码, IVR应答时间)组合键——该键即"同一通电话"的判定依据。 - 归属条件:接入号匹配该行 且 IVR 已应答 且 主叫为外线(非内部分机/内部分组号)。
- 未到 IVR 应答的呼叫无法归属到接入号,天然不计入 totalInboundCalls 分母(已知边界,属预期)。
5.2 总接通率(呼叫级)
- 分母 = 去重呼叫数;分子 = 存在任一接通证据的呼叫数: 机器人接起(AI_ROBOT 行且状态为已接通且时长 >0),或人工接起(转接类行且坐席分机接通)。
- 一通"机器人接听后转人工再接通"的电话只计 1 通接通(呼叫级去重)。
- IVR 放音阶段挂断、排队/振铃中无人接起的呼叫计入分母、不计入分子。
5.3 AI 指标(aiStats)
- 统计对象为机器人行(business=AI_ROBOT,含方向过滤——主叫或被叫号码长度 ≥5, 与 OMS 机器人报表"全部"视图一致,见 §6)。
- 外线前提(v1.2,2026-09-03):主叫须为外线(非内部分机/内部分组号)——内部分机 (如 804)呼入接入号时,callee=接入号(≥5 位)会穿过方向过滤,此类呼叫不计入 AI 通话量/时长/转人工,与 §5.1 呼叫级归属口径对齐;主叫为空同样不计(无法归属)。
- AI 转人工:该行转人工标识(forward)非空即计。
- avgTalkDurationSec = 机器人行时长总和 ÷ 机器人行总量(含 0 时长行,见 §6)。
5.4 人工接听(humanAgentStats)
- 人工呼入量指标已删除(v1.1,2026-09-03):呼入规模请使用
totalInboundCalls(总呼入量)。 - 人工接听量(answeredCount),须同时满足:
- 主叫为外线(非内部分机/内部分组号);
- 转接类行(business = AI_ROBOT_TRANSFER_IN 或 IVR_TRANSFER);
- 坐席真实接通:state=STATE_RECEIVED 且被叫为坐席分机号码—— callee 为接入号(如 1000)等非分机号码的行不算人工接听;
- 排队中放弃、振铃未接的行不计——STATE_FAILED 归漏接,体现在 总接通率(§5.2)的分母中。
- 合规接听(阈值可配置,v1.3):接听且该腿振铃时长 ≤N 秒(含边界),N = 系统配置
statistical.compliant.ring.threshold(默认 7,2026-09-10 定,分机振铃有延迟;现场可调,如收紧回 3); 本响应实际生效值透出在data.compliantRingSeconds。分母为人工接听量(answeredCount)。 - avgResponseTimeSec 仅对接听的行求振铃时长均值(不含排队时长)。
5.5 满意度(satisfactionStats)
- 参评 = 通话结束按键评价有效(非空且非 '0',即按键 1..maxkey;maxkey 由系统满意度 按键配置决定);好评 = 按键 '1'。
- positiveRate = 好评行数 ÷ 参评行数;参评为 0 时输出 0。
6. 口径偏差表(与 OMS 既有报表对比)
本接口指标与 OMS 既有报表存在以下三处有意差异,对账时请注意:
| # | 指标 | 本接口(robot_stats) | OMS 既有报表 | 说明 |
|---|---|---|---|---|
| 1 | 合规接听阈值 | 振铃时长 ≤N 秒(含边界;N 可配置,默认 7,响应透出 data.compliantRingSeconds) | 快捷接听为 <15 秒(固定) | 本接口合规阈值默认 7 秒(2026-09-10 定,分机振铃延迟补偿),现场可配置;两口径数值不可直接互比 |
| 2 | AI 平均通话时长 | 总时长 ÷ 总量(分母含 0 时长的行) | 平均值排除 0 时长的行 | OMS 的 AVG 剔除 0 时长腿后均值偏高;本接口按"总量÷总数"公式 |
| 3 | AI 统计行范围 | 带方向过滤(主叫或被叫号码长度 ≥5),与 OMS 机器人报表**"全部"视图**一致 | OMS 可按"仅外呼/仅呼入"筛选 | 与 OMS"全部"视图对账一致;与筛选视图对比会出现差异 |
除上述三处外,其余指标(呼入识别、接听判定、满意度公式)复用既有报表同款公式,数值可对账。
7. 错误全表
| code | 触发场景 | message(实际返回文案,英文) | 集成方处置 |
|---|---|---|---|
| HTTP 401 | IP 白名单与 Basic 均未通过 | (Tomcat 默认错误页,非 JSON,无 code 字段) | 核对来源 IP / Basic 账号;找管理员加白或核对账号 |
| 400 | granularity 非法 | invalid granularity 'week', expected 'day' or 'month' | 改为 day 或 month(或不传) |
| 400 | 日期缺失/格式错 | invalid date format, expected yyyy-MM-dd: startDate=2026/8/1 endDate=2026-08-20 | 按yyyy-MM-dd 传日期 |
| 400 | endDate < startDate | endDate must not be before startDate | 调整区间 |
| 400 | day 跨度超限 | span 400 days exceeds limit 366 for granularity=day, split the query | 按年拆分调用(§8) |
| 400 | month 跨度超限 | span 61 months exceeds limit 60 for granularity=month, split the query | 按段拆分调用(§8) |
| 400 | accessNumber 非法 | invalid accessNumber, allowed pattern: ^[0-9#+\-*]{1,30}$ | 只用数字/#+*-、≤30 位 |
| 200(裸字符串) | json 体缺失/不可解析 | "420"(裸字符串,非 JSON 信封;容器层既有行为,见下方说明) | 检查 json 参数及其 URL 编码;解析响应体前请先判断是否以 "{" 开头 |
| 404 | opt 拼错(容器级,未命中任何业务) | unknown opt: robot_stat | 检查 opt 拼写,必须为 robot_stats |
| 500 | 服务端内部错误(数据库异常、时区不一致等) | internal error, contact administrator with requestId | 凭响应中的 requestId 向系统管理员报障;响应仍含 requestId/asOf/caliberVersion,无 data |
| 503 | 鉴权未配置(IP 白名单与 Basic 两键均为空) | authentication not configured, contact administrator | 联系管理员配置任一鉴权后重试(§2) |
说明:
- 上表除 HTTP 401 外,业务错误(code=400/404/500/503)的 HTTP 状态均为 200,错误信息在
响应体 JSON 中;集成方解析逻辑应以
code字段为准,且不能假定data一定存在。 - 400/500/503 响应均含
requestId/asOf/caliberVersion;404 为容器级返回,仅含code/message。 - 容器层其他错误(与本接口业务无关,沿用通道既有行为):缺
opt参数 → HTTP 400 +{"error":"Missing required parameter 'opt'"};POST body 超 1MB → HTTP 413; 缺json参数或 json 体不可解析 → HTTP 200 + 裸字符串"420"(即上表 json 行,同样 是容器层既有行为,非 JSON 信封,集成方解析响应体前应先判断是否以{开头)。
8. 限值与使用建议
8.1 跨度限值
| 粒度 | 单次查询上限(含首尾) | 超限返回 |
|---|---|---|
| day | ≤366 天 | 400,文案含实际跨度与限值(见 §7) |
| month | ≤60 个月 | 400,同上 |
超限拆分建议:按边界切分为多次调用后本地累加。计数类字段可直接相加;比率与均值不要
直接相加或平均,请用 summary 的分子分母口径(或保存各行原始计数)自行重算。示例:查询
2025-01-01 ~ 2026-12-31(day)超限,可拆为 2025-01-012025-12-31 与 2026-01-012026-12-31
两次调用。
8.2 数据量与查询建议
- 不传 accessNumber 时返回全部接入号的分组行:day 粒度 × 全部接入号 × 全年可达
万行级。建议集成方固定携带
accessNumber参数按接入号拉取。 list顺序不保证,请按(accessNumber, statDate)自行排序/建索引。
8.3 数据新鲜度与边界(均为预期行为,非故障)
- 通话记录按 15 秒周期批量落库,统计为 T+15 秒新鲜度:刚结束的通话最多 15 秒后 才进入统计;进行中的通话不计入。
endDate为当天时,最后不足 15 秒的末段不计入;如需当天完整数据,请在次日再拉取 或多次补拉。- 可查历史范围 = calllog 数据保留期,以现场归档策略为准(归档清理后的历史窗口将 返回空结果,见 §3.3),部署时请与系统管理员确认保留时长。
8.4 运行时路径与性能预期
- 查询范围在系统呼叫记录缓存覆盖期内时(
source=cache),统计纯内存聚合完成,不逐行 访问数据库(每次查询仅读取一次分机号/分组号配置集);覆盖期之外(source=db)走单条 聚合 SQL。两条路径结果经内部交叉验证保证一致,source仅供参考与运维核对。 - 性能预期:缓存路径毫秒级;数据库路径与既有 KPI 统计同量级。
- P99 粗测数据(本地开发环境,localhost 单机串行 curl,N=10,P99 以最大值近似,非压测,生产负载需另行压测):
- 缓存路径(
source=cache,2026-08-19~2026-08-20 day 粒度):中位约 2.2ms,最大 2.8ms; - 数据库路径(
source=db,2025-01-01~2026-08-20 month 粒度,12 组,走idx_calllog_accessnum_begintime复合索引):中位约 14.2ms,最大 15.4ms;空结果窗口(2026-01)最大 3.2ms。
- 缓存路径(
9. 版本与兼容
- 响应中的
caliberVersion为口径版本号,当前"1.3"。指标定义发生任何调整时版本号 递增,集成方可据此识别口径切换并对账。 - v1.3(2026-09-10)变更:合规接听阈值由固定 3 秒改为系统配置
statistical.compliant.ring.threshold(默认 7,2026-09-10 定——分机实际振铃有延迟; 振铃 ≤N 秒含边界,现场可调)。新增data.compliantRingSeconds透出本次实际生效阈值;compliantAnsweredCount3s/compliantAnswerRate3s字段名不变(3s 为 v1.0 固定 3 秒时 的历史命名)——本版起取值口径默认即为 ≤7 秒,与 1.2 及更早(固定 3 秒)不同;若需 回到 1.2 对账口径,由管理员将配置调为 3 即可。消费方解释合规口径时以data.compliantRingSeconds为准,阈值调整前后的合规率不可直接互比。 - v1.2(2026-09-03)变更
指标(aiStats 的通话量/时长/转人工)加外线前提—— 主叫须为外线(非内部分机/内部分组号),主叫为空不计。此前内部分机(如 804)呼入接入号时, callee=接入号(≥5 位)穿过方向过滤会被计入 AI 通话量/平均时长;修正后与 §5.1 呼叫级归属 口径一致。字段集不变,仅取值口径修正。 - v1.1(2026-09-03)变更:①删除人工呼入量字段(行级
humanAgentStats.inboundCount、 汇总summary.humanInboundCount),呼入规模改用totalInboundCalls;②人工接听口径收紧: 仅计"外线 + 转接类行 + 坐席分机真实接通"——callee 为接入号等非分机号码不再计入, STATE_FAILED 归漏接;③3 秒合规接听率分母由人工呼入量改为人工接听量。 该删除发生在任何外部对接完成之前(接口尚无集成方),无兼容性影响。 - 字段只增不减(自 1.1 起):
1.x范围内后续演进只新增字段、不删除、不改既有字段名与 语义;集成方解析时应容忍新增字段(前向兼容)。唯一例外:v1.3 起compliantAnsweredCount3s/compliantAnswerRate3s的取值随可配置阈值 N 变化(字段名不变,默认 N=7,配 3 时与 1.2 一致,实际阈值见data.compliantRingSeconds),已按上述 v1.3 条目明示。 - 重大不兼容变更(删除/改名字段、改行唯一键等)将启用新的 opt 值
robot_stats_v2, 原robot_stats保持可用,迁移窗口提前通知。 cityName本期恒为空串;未来填充真实城市时,行唯一键将由(accessNumber, statDate)扩展为(accessNumber, cityName, statDate)——属重大变更,将按上述承诺提前书面通知 并同步升级 caliberVersion / 切换 v2。
- 文档版本:1.3(2026-09-10,口径 1.3:合规阈值可配置默认 7+新增 data.compliantRingSeconds;口径 1.2:AI 指标加外线前提;口径 1.1:删人工呼入量、人工接听收紧;初版 1.0 于 2026-08-26 随 robot_stats 首版交付)
- 问题支持:凭响应
requestId联系系统管理员查日志(服务端日志含同 ID 的请求摘要)。
