三方智能体接口开发说明文档
三方智能体接口开发说明文档
本文说明三方智能体要接收的请求、要返回的 SSE 事件,以及挂机、转人工、按键指令的写法。平台侧绑定和语音导航变量见 三方智能体对接配置说明文档。
通话中的用户话术来自 RASR。这不是挂机后的 ASR。座席工作台实时转写事件是 transcript,不是本接口的 query。
快速阅读
外呼机器人使用 responseMode=streaming,按 SSE 返回。平台把各次 answer.content 按到达顺序拼接后做 TTS。智能体不要在后续片段里重复已经返回过的前文。
首 token 建议低于 350ms,最长建议不超过 500ms。这是交互建议,不是接口超时字段。
挂机指令是 #挂机#,转人工指令是 #转人工#。指令前后不要加标点或其他文字。TTS 只播报对话文本,不播报指令。
阅读地图
| 内容 | 章节 |
|---|---|
| URL、密钥和接入示例 | 配置项 |
| 请求里各字段谁产生、何时出现 | 请求 |
message、message_end、error、agent_thought | 返回 |
| 打断、攒句、沉默、挂机、转人工、按键 | 通话轮次 |
| 怎样算对接成功 | 生效、验收 |
配置项
开发完成后交给平台侧实施:
| 项 | 必填 | 说明 |
|---|---|---|
| 调用地址 | 是 | 由 protocol、host、path 组成 |
| appKey | 是 | 鉴权 |
| secretKey | 是 | 鉴权 |
| stream | 是 | 外呼机器人设为 true |
| user | 否 | 接入示例中的用户名 |
{
"chatHandleParams": {
"protocol": "https",
"host": "for.example.com",
"path": "/path/example",
"stream": true,
"appKey": "ThisIsAppKey",
"secretKey": "ThisIsSecretKey",
"user": "UserName"
}
}鉴权使用平台约定的三方智能体签名规则,材料是 appKey 与 secretKey。请求验签通过后才处理正文。签名步骤沿用联调时给出的规则。
responseMode 有 streaming 和 blocking。外呼机器人使用 streaming。
请求
平台发到智能体的请求使用下列字段。
| 字段 | 作用 |
|---|---|
| requestUniqueId | 每一次请求一条。对账和排错用这个标识 |
| conversationId | 会话标识。开场白那次由智能体创建并返回。同一通后续轮次都带它。平台不在请求里附带全部历史 |
| userField | 自定义变量。用于个性化播报,或多场景路由 |
| responseMode | streaming 或 blocking |
| query | 当前轮用户内容。元素含 content、contentType |
| contentType | 文本轮次为 text |
| currentChatRound | 轮次序号。攒句并发时用它判断先后 |
| playedContent | 上一轮已被打断时,实际已经播出去的文本。未打断时不靠这个字段 |
| cancelRquestUniqueIds | 攒句时有值。智能体按该列表去掉对应历史请求。字段名保持这个拼写 |
个性化变量示例:
{
"userField": {
"name": "张三",
"city": "上海",
"car_model": "TR9"
}
}路由变量示例:
{
"userField": {
"arg": "{arg}"
}
}arg 的取值由语音导航变量决定,例如 car_marketing、after_sale、finance。它们不是平台枚举。
通话轮次
用户在播报结束后说话:
{
"query": [
{
"content": "如何重置密码",
"contentType": "text"
}
],
"currentChatRound": 10
}播报过程中被有效打断。playedContent 是上一轮已经播出的内容:
{
"query": [
{
"content": "如何重置密码",
"contentType": "text"
}
],
"playedContent": "您好,我是上一轮播音被打断时已播放的内容",
"currentChatRound": 10
}用户连续说了两句、外呼机器人尚未回复,触发攒句。两句用中文句号 。 拼进 query.content。cancelRquestUniqueIds 有值。攒句时可能并发多个请求,用 currentChatRound 定顺序:
{
"conversationId": "b1fcdc6123c62be261cf97b00b25be6a2af",
"query": [
{
"content": "如何结算。使用现金结算",
"contentType": "text"
}
],
"currentChatRound": 10
}播报结束后,用户沉默超过设定时长。时长在业务流程里配置。请求内容为:
{
"query": [
{
"content": "(沉默)",
"contentType": "text"
}
],
"currentChatRound": 10
}返回
流式响应用 SSE。一条回复由多条 message 组成,结束时发 message_end。异常发 error。工具调用发 agent_thought。
message:
event: message
data:{"event":"message","conversationId":"94154941-4c5e-4f40-a898-bef53a9e84a1","answer":{"content":"示例1","contentType":"text","createdAt":1728634543000,"messageId":"553fa51b-6e5b-46cb-89ae-c2eb3073b2f6"}}content 是当前片段。平台按顺序拼接。第一次返回「你好」,第二次返回「,张三」,播报为「你好,张三」。若第二次又返回完整句「你好,张三」,播报会变成「你好你好,张三」。
message_end。收到后平台结束本次流式读取:
event: message_end
data:{"event":"message_end","conversationId":"94154941-4c5e-4f40-a898-bef53a9e84a1","answer":{"createdAt":1728698606000,"messageId":"553fa51b-6e5b-46cb-89ae-c2eb3073b2f6"}}error:
event: error
data:{"event":"error","conversationId":"94154941-4c5e-4f40-a898-bef53a9e84a1"}正常播报:
data:{"answer":{"content":"您好","contentType":"text","createdAt":1752800446},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"很高兴为您服务。","contentType":"text","createdAt":1752800447},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"请问有什么可以帮您的","contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800449},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}挂机。末尾指令为 #挂机#,TTS 不读该指令:
data:{"answer":{"content":"感谢您的来电","contentType":"text","createdAt":1752800446},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"再见#挂机#","contentType":"text","createdAt":1752800447},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}转人工。末尾指令为 #转人工#:
data:{"answer":{"content":"正在为您转接人工服务","contentType":"text","createdAt":1752800446},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"请稍等#转人工#","contentType":"text","createdAt":1752800447},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}按键采集,说话不能打断。指令为 DTMF{6|5|您没有按啊,可以再按一次吗|2|0}:
data:{"answer":{"content":"请按键输入您的pin码,按井号键结束。","contentType":"text","createdAt":1752800446},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"DTMF{6|5|您没有按啊,可以再按一次吗|2|0}","contentType":"text","createdAt":1752800447},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}按键采集,说话可以打断。指令为 DTMF_INTERRUPT{...},花括号内字段与上例相同:
data:{"answer":{"content":"请按键输入您的pin码,按井号键结束。","contentType":"text","createdAt":1752800446},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"DTMF_INTERRUPT{6|5|您没有按啊,可以再按一次吗|2|0}","contentType":"text","createdAt":1752800447},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}工具调用。agent_thought 带 tool,随后仍用 message 播报,并以 message_end 结束:
data:{"tool":"current_time","conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"agent_thought"}
data:{"answer":{"content":"当前时间是","contentType":"text","createdAt":1752800448},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"content":"2025年1月1号1时1分","contentType":"text","createdAt":1752800449},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message"}
data:{"answer":{"contentType":"text","createdAt":1752800450},"conversationId":"b1fcdc6123c62be261cf97b00b25be6a2af","event":"message_end"}生效
- 服务按同一鉴权规则验签。
- 平台已配置 URL、
appKey、secretKey,且外呼机器人流程进入该智能体。 - 开场白响应里带上新的
conversationId,后续轮次沿用。 streaming时持续输出message,本轮结束输出message_end。- 需要挂机、转人工或按键时,指令出现在拼接后的文本末尾,且没有多余标点。
blocking 可以返回整段结果,外呼机器人实时对话仍以 streaming 为准。
验收
- 用
requestUniqueId能在双方日志里对上同一轮。 - 开场白之后的轮次,
conversationId不变;请求里没有全量历史。 - 片段拼接与「不要重复前文」的例子一致。
- 打断轮次能读到
playedContent。攒句轮次query.content含。,且cancelRquestUniqueIds有值。 - 沉默轮次的
content为(沉默)。 #挂机#、#转人工#触发对应通话动作,电话里听不到这两个指令。DTMF{...}进入按键且说话不能打断;DTMF_INTERRUPT{...}进入按键且说话可以打断。- 验签失败时智能体拒绝请求,通话没有正常播报。
Updated about 2 months ago