调用方在集成AI口语老师API时,请遵循以下规则。
规则 | 描述 |
---|---|
传输方式 | HTTPS |
请求方式 | POST |
字符编码 | 统一使用UTF-8 编码 |
请求格式 | application/json |
响应格式 | text/event-stream |
AI口语老师线上调用地址:
https://openapi.youdao.com/ai_dialog
注意: 签名生成方法如下: signType=v4; sign=sha256(应用ID+salt+curtime+应用密钥);
接口uri:/chatStream
接口说明:
{
"appKey":"", // 必填 appkey 权限认证
"salt":"", // 必填 随机串 权限认证
"curtime":"", // 必填 时间戳 权限认证
"signType":"v4", // 必填 仅支持v4 权限认证
"sign":"", // 必填 sha256(appKey + salt + curtime +appSecret) 权限认证
"userLevel": "0", // 非必填 用户水平等级(字符串):0表示1-3年级小学生;1表示4-6年级小学生;2表示初中生;3表示高中生/大学生(四六级),默认2
"history": [ // 必填,对话历史,注: 1.当isTopic=true,第一次调用根据首句生成topic,此时应该只有[{"speaker": "User", "content": "xxx"}] 2.当isTopic=false,第一次调用传[{"speaker:User", "content": "xxx"}]
{
"speaker":"System", // 讲话人:系统
"content":"Hi there! My name is Sarah, and I'm from New York. What's your name and where are you from?" // 讲话内容, 语种限制英文
},
{
"speaker":"User", // 讲话人:用户
"content":"Hello, I'm Echo, I come from China. Nice to meet you. Do you have any hobbies?" // 讲话内容, 语种限制英文,单词数限制80
}
]
}
部分 | event类型 | data结构 | 说明 |
---|---|---|---|
第1部分 | message | 一个data示例:data": { "type": "1或者2", "content":"内容", "requestId":"xxx" } |
data中有三部分,type=1是系统回复,type=2是推荐回复, content是具体内容,一次http请求requestId是一样的 |
第2部分 | end | 一个data示例:一个data示例:data": { "requestId":"xxx" } |
当event=end时,无需关注data |
注:1. data中type=1是系统回复,以若干个包流式输出,需要组织type=1的所有数据拼接成一个完整回复。 type=2时,是推荐回复,每次输出一个完整的推荐回复,总共会出现3个推荐回复。
部分 | event类型 | data结构 | 说明 |
---|---|---|---|
第1部分 | message | 一个data示例:data": { "type": "1或者2", "content":"内容", "requestId":"xxx" } |
data中有三部分,type=1是系统回复,type=2是推荐回复, content是具体内容,一次http请求requestId是一样的 |
第2部分 | error | 一个data示例:data": { "errorCode": "错误码", "errorMsg":"错误信息", "requestId":"xxx" } |
关注errorCode和errorMsg |
注: 如果是鉴权类错误,可能没有第一部分(正常的message),直接返回error包。
每一个ServerSentEvent如下所示
ServerSentEvent [id = '1', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":"Hi"}]
ServerSentEvent [id = '2', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":","}]
ServerSentEvent [id = '3', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" I"}]
ServerSentEvent [id = '4', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":"’m"}]
ServerSentEvent [id = '5', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" fine"}]
ServerSentEvent [id = '6', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":","}]
ServerSentEvent [id = '7', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" thank"}]
ServerSentEvent [id = '8', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" you"}]
ServerSentEvent [id = '9', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":"."}]
ServerSentEvent [id = '10', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" And"}]
ServerSentEvent [id = '11', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":" you"}]
ServerSentEvent [id = '12', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":1,"content":"?"}]
ServerSentEvent [id = '13', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":2,"content":" I’m good, how about you? "}]
ServerSentEvent [id = '14', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":2,"content":" Pretty good, what about you? "}]
ServerSentEvent [id = '15', event='message', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58","type":2,"content":" Not bad, yourself? "}]
ServerSentEvent [id = '16', event='end', retry=null, comment='null', data={"requestId":"a91af3e7-53b4-446e-8681-e881dac31c58"}]
ServerSentEvent [id = '1', event='error', retry=null, comment='null', data={"requestId":"945ecfa5-b385-4216-8dd8-c30ff05ed787","errorCode":"108","errorMsg":"auth failed"}]
状态码 | 状态码含义 |
---|---|
101 | 缺少必填的参数,首先确保必填参数齐全,然后,确认参数书写是否正确。 |
102 | 不支持的语言类型 |
103 | 翻译文本过长 |
104 | 不支持的API类型 |
105 | 不支持的签名类型 |
106 | 不支持的响应类型 |
107 | 不支持的传输加密类型 |
108 | 应用ID无效,注册账号,登录后台创建应用并完成绑定,可获得应用ID和应用密钥等信息 |
109 | batchLog格式不正确 |
110 | 无相关服务的有效应用,应用没有绑定服务。注:某些服务的结果发音需要tts服务,需要在控制台创建语音合成实例绑定应用后方能使用。 |
111 | 开发者账号无效 |
112 | 请求服务无效 |
113 | q不能为空 |
114 | 不支持的图片传输方式 |
201 | 解密失败,可能为DES,BASE64,URLDecode的错误 |
202 | 签名检验失败,如果确认应用ID和应用密钥的正确性,仍返回202,一般是编码问题。请确保翻译文本 q 为UTF-8编码. |
203 | 访问IP地址不在可访问IP列表 |
205 | 请求的接口与应用的平台类型不一致,确保接入方式(Android SDK、IOS SDK、API)与创建的应用平台类型一致。如有疑问请参考入门指南 |
206 | 因为时间戳无效导致签名校验失败 |
207 | 重放请求 |
303 | 服务异常 |
405 | 鉴权失败 |
AIDIALOG003 | 不支持的userLevel字段 |
AIDIALOG006 | 不支持的speaker字段 |
AIDIALOG007 | 讲话人顺序异常 |
AIDIALOG008 | 不支持的语种 |
AIDIALOG009 | content字段长度或单词数超出限制 |
AIDIALOG010 | 生成场景失败 |
AIDIALOG011 | 生成推荐表达失败 |
AIDIALOG012 | 生成对话失败 |
AIDIALOG013 | history字段异常: 结构异常等 |
AIDIALOG019 | 请求中包含敏感词 |
AIDIALOG020 | 系统回话中包含敏感词 |
AIDIALOG022 | 系统无结果 |
AIDIALOG025 | extJson字段异常 |
AIDIALOG026 | 请求大模型异常 |
AIDIALOG027 | history参数异常 |