机器人对话API接口2.0
2.0版本已停止日常维护,建议使用3.0版本。
简介
Hi,您好,欢迎使用百度智能对话定制与服务平台(UNIT)机器人对话API服务。
本文档主要针对API开发者,描述百度智能对话定制与服务平台机器人对话接口服务的相关内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
- 在百度云控制台内提交工单,工单类型请选择人工智能-智能对话定制与服务平台UNIT服务;
- 进入UNIT开发者论坛发帖交流。
文档约定
参数结构约定
示例 | 说明 |
---|---|
+ | "+"号表示字段层级,首层为第0层级 |
aaa[].bbb | aaa是一个list,bbb是list中的一个元素的属性 |
aaa{}.bbb | aaa是一个kvdict,bbb是某个key下的一个value的属性 |
enum | 枚举值 |
optional | 用于描述应答参数,表明某个参数在应答中不一定存在 |
- 所有参数都使用 UTF8 编码
- 输入、输出中,所有offset、begin、length字段的单位为字符(编码无关)
对话接口描述
基于用户输入的文本内容(语音输入最终也转为文本),返回机器人理解与应答的信息。调用本对话API的前提是您已经在 unit.baidu.com 创建了机器人,并添加了至少一个已定义过的技能(新建了对话意图或问答意图、添加了对话模板/对话样本,且最少完成了一次模型的训练)。
请求说明
HTTP方法:POST
请求URL:
- 沙盒环境
【不区分机房】https://aip.baidubce.com/rpc/2.0/unit/service/chat - 生产环境
【华北机房】https://unit.bj.baidubce.com/rpc/2.0/unit/service/chat
【华东机房】https://unit.su.baidubce.com/rpc/2.0/unit/service/chat
【华南机房】https://unit.gz.baidubce.com/rpc/2.0/unit/service/chat
【全国域名】https://unit-api.baidu.com/rpc/2.0/unit/service/chat - 注意:
- 生产环境域名需将技能部署到生产环境后才可使用。
- 若多技能有生产环境,建议购买、部署到同一机房。
- 全国域名还在开发中,目前支持华北机房,若有其他需求,可与客服沟通。
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/json |
Body中放置请求参数,参数详情如下:
请求参数说明
参数 | 类型 | 是否必需 | 说明 |
---|---|---|---|
version | string | 必需 | =2.0,当前api版本对应协议版本号为2.0,固定值 |
service_id | string | 可选 | 机器人ID,service_id 与skill_ids不能同时缺失,至少一个有值。 |
skill_ids | list<string> | 可选 | 技能ID列表。我们允许开发者指定调起哪些技能。这个列表是有序的——排在越前面的技能,优先级越高。技能优先级体现在response的排序上。具体排序规则参见【应答参数说明】 service_id和skill_ids可以组合使用,详见【请求参数详细说明】 |
log_id | string | 必需 | 开发者需要在客户端生成的唯一id,用来定位请求,响应中会返回该字段。对话中每轮请求都需要一个log_id |
session 或 session_id | string(json) 或 string | 必需 | session保存机器人的历史会话信息,由机器人创建,客户端从上轮应答中取出并直接传递,不需要了解其内容。如果为空,则表示清空session(开发者判断用户意图已经切换且下一轮会话不需要继承上一轮会话中的词槽信息时可以把session置空,从而进行新一轮的会话)。 session字段内容较多,开发者可以通过传送session_id的方式节约传输流量。具体操作方式见【请求参数详细说明】 以下为session内部格式,仅供参考了解 |
+service_id | string | 必需 | 机器人ID,标明该session由哪个机器人产生。 |
+session_id | string | 必需 | session本身的ID,客户端可以使用session_id代替session,节约传输流量。 |
+skill_sessions | kvdict of strings | 必需 | 这里存储与当前对话相关的所有技能的session。key为技能ID,value为技能的session(同【UNIT对话API文档】中的bot_session)。 |
+interactions | list<object> | 必需 | 历史交互序列,即历史 request/response_list 序列,序列的每一个元素称作一次交互(interaction),随交互进行而交替插入,格式与上述不断增长直到发生清空操作。 |
+interactions[].interaction_id | string | 必需 | 第 i 次交互的唯一标识。 |
+interactions[].timestamp | string | 必需 | interaction生成的时间(以interaction_id的生成时间为准)。格式:YYYY-MM-DD HH:MM:SS.fff (24小时制,精确到毫秒) |
+interactions[].request | object | 必需 | 第 i 次交互的 request,结构参考【请求参数说明】中的request |
+interactions[].response_list | list<object> | 必需 | 第 i 次交互的 response列表,结构参考【应答参数说明】中的response_list |
dialog_state | object | 可选 | 机器人对话状态。 |
+skill_states | kvdict of objects | 可选 | 技能的对话状态key为技能ID,value为技能的对话状态数据。具体数据格式后续发布。 |
+contexts | json object |
可选 | 希望在多技能对话过程中贯穿的全局性上下文. 这里预留了一个key用于控制各技能的session记忆。详见【请求参数详细说明】 |
request | object | 必需 | 本轮请求体。 |
+user_id | string | 必需 | 与技能对话的用户id(如果客户端是用户未登录状态情况下对话的,也需要尽量通过其他标识(比如设备id)来唯一区分用户),方便今后在平台的日志分析模块定位分析问题、从用户维度统计分析相关对话情况。详情见【请求参数详细说明】 |
+query | string | 必需 | 本轮请求query(用户说的话),详情见【请求参数详细说明】 |
+query_info | object | 可选 | 本轮请求query的附加信息 |
++type | string enum |
可选 | 请求信息类型,取值范围:"TEXT","EVENT"。详情见【请求参数详细说明】 |
++source | string enum |
可选 | 请求信息来源,可选值:"ASR","KEYBOARD"。ASR为语音输入,KEYBOARD为键盘文本输入。针对ASR输入,UNIT平台内置了纠错机制,会尝试解决语音输入中的一些常见错误 |
++asr_candidates | list<object> | 可选 | 请求信息来源若为ASR,该字段为ASR候选信息。(如果调用百度语音的API会有该信息,UNIT会参考该候选信息做综合判断处理。) |
++asr_candidates[].text | string | 可选 | 语音输入候选文本 |
++asr_candidates[].confidence | float | 可选 | 语音输入候选置信度 |
+client_session | string(json) | 可选 | 用于在多轮中实现多选一的对话效果,具体内容见【请求参数详细说明】 |
+hyper_params | kvdict of object | 可选 | key为技能id或机器人id(现在只实现技能id),value为控制相关技能/机器人内部行为的的超参数 |
+hyper_params{}.bernard_level | int | 可选 | 技能自动发现不置信意图/词槽,并据此主动发起澄清确认的频率。取值范围:0(关闭)、1(低频)、2(高频)。取值越高代表技能对不置信意图/词槽的敏感度就越高,默认值=1 |
int | 可选 | 参数已废弃 | |
double | 可选 | 参数已废弃 | |
+hyper_params{}.slu_tags | list<string> | 可选 | 用于限定slu的解析范围,只在打上了指定tag的意图、或问答对的范围内执行slu |
+hyper_params{}.dynamic_slots | kvdict of list<string> | 可选 | 针对特定词槽启用『动态词典』机制,key为词槽名(如user_xxx),value为针对该词槽启用的动态词典id(可以同时启用多个动态词典)。 |
请求参数详细说明
service_id与skill_ids的组合关系
在一次请求中,service_id与skill_ids两者可以组合使用,不同的组合关系所代表的语义如下表。
service_id | skill_ids | 语义 |
---|---|---|
有 | 有 | 调用从属于service_id所对应机器人中的某些技能。要求skill_ids中不可以包含不属于该机器人的技能。 |
有 | 无(或为空) | 调用从属于service_id所对应机器人中的所有技能。技能的顺序按照机器人所配置的顺序设定。 |
无(或为空) | 有 | 调用开发者名下的一系列技能,这些技能不一定从属于某个机器人。 |
利用session_id实现多轮对话
session保存了历史会话信息,随着对话的进行,在客户端和UNIT之间来回传递,并且被不断更新。理论上客户端与UNIT双方都可以对session进行更新与修改,然而,多数开发者并没有修改session的需求,而session数据的体量偏大,又对网络传输的流量与延时产生了额外的压力。
为了解决这一矛盾,UNIT支持基于session_id的会话托管:客户端在首轮对话时传入一个空的session_id字段,在应答阶段,UNIT会把会话信息托管在云端并且为其分配一个session_id。在后续对话中,客户端只需要继续传入这个session_id,并在dialog_state.contexts["SYS_REMEMBERED_SKILLS"]中设定一个技能ID列表,避免处于列表中的技能session被清空,就可以基于历史会话信息与机器人进行多轮对话,而无需接触复杂的原始session。
总结起来,开发者可以选择以下两种方式与机器人对话API进行多轮对话:
- 方式1:客户端在首轮会话时以“session”为key传入一个空串,UNIT会在应答中以“session”为key,返回原始的会话数据(一个json字符串)。如需进行多轮对话,客户端在后续对话中以“session”为key,继续传送前轮返回的会话数据。在这种方式下,开发者可以对会话数据做出自己想要的修改(只要符合UNIT的格式要求)。
- 方式2:客户端在首轮会话时以“session_id”为key传入一个空串,UNIT会把会话数据托管在云端,在应答中以“session_id”为key,返回一个用于指代云端的会话数据的ID号。如需进行多轮对话,客户端在后续对话中以“session_id”为key,继续传送前轮返回的ID号。在这种方式下,开发者没有办法修改会话数据。
- 另外需要在dialog_state.contexts["SYS_REMEMBERED_SKILLS"]中设定一个技能ID列表,避免处于列表中的技能session被清空,导致无法完成多轮对话。
无论以上哪种方式,只要传入一个空的session_id或者session字段,即代表不再继承历史会话信息,后续将开始新的对话。
dialog_state.contexts
dialog_state.contexts字段以一个开放的json对象存储所有与对话相关的上下文信息。我们当前预留了一个key,用于开发者控制各个技能的session记忆,如下表:
key | type | 说明 |
---|---|---|
SYS_REMEMBERED_SKILLS | list<string> | 当前UNIT默认同时请求机器下属的所有技能,或者由skill_ids设定的所有技能。因为我们不清楚开发者最终会选择使用哪个(或者哪些)技能的应答用于下轮对话,所以在默认情况下不做任何session记忆(在新一轮请求时清空所有技能的session)。 开发者可以通过在dialog_state.contexts["SYS_REMEMBERED_SKILLS"]中设定一个技能ID列表,避免处于列表中的技能session被清空,以便与这些技能进行多轮对话。 |
request.user_id
- 开发者为其用户分配的id,用于区别开发者的每个最终用户。
- UNIT保留两种形式的id,开发者在为最终用户分配id时应当避免分配这些形式的id。
ID形式 | 说明 |
---|---|
UNIT_WEB_* | 用于标识来自UNIT网站对话窗口的请求。形式为UNIT_WEB_ + 技能ID/机器人ID |
UNIT_DEV_* | 用于标识来自开发者自己的请求。形式为UNIT_DEV_ + 任意后缀(一个好的选择是使用开发者的百度id作为后缀) |
request.query_info
request.query:本轮请求query
- query_info.type为TEXT时,为常规的文本型query
- query_info.type为EVENT时,为一组K-V(json),且其中必须包含一个名为『event_name』的key,其他自便。
-
我们预定义三种event_name及对应的数据格式: "CHOICE","@UNIT"和"RESET"
-
CHOICE:用户点击了一个界面选择项
key 类型 说明 event_name string =CHOICE interaction_id string 选项来自哪个interaction_id(会由UNIT返回) index string 点击了第几个选项(从1开始) - @UNIT:发起对上轮意图/词槽/问答对的干预[机器人级的干预功能正在开发中,当前暂不支持]
-
RESET:清空session。
key 类型 说明 event_name string =RESET
-
request.client_session
request.client_session:用于在多轮中实现多选一的对话效果,查看详细使用说明。
- 使用这个字段它必须包含两个key,它们是client_results和candidate_options(值可以分别设为空串和空list)
- 注意client_session 字段的类型是string,传入的K-V结构数据需要转义成字符串。例如:
"client_session": "{\"client_results\":\"\", \"candidate_options\":[]}"
key | 类型 | 说明 |
---|---|---|
client_results | string(json) | 预留字段 |
candidate_options | list<object> | 存储client端提供的候选项列表,每个候选项对应一个object。 |
candidate_options详细介绍:
示例格式:
{
"attributes": {
"attr_name_1": "attr_value_1",
"attr_name_2": "attr_value_2"
},
"slot_updates": {
"slot_name_1": "slot_value_1",
"slot_name_2": "slot_value_2"
},
"remember": true
}
对于每个候选项,attributes、slot_updates、remember三个key,分别说明如下:
key | 类型 | 说明 |
---|---|---|
attributes | object | 一组kv,记录该候选的若干属性及属性值,attr_name可自行设定,attr_value支持int、float和string类型的值,如:{"movie_name":"花样年华", "year":1998, "actor":"梁朝伟"} |
slot_updates | object | 用户提供的候选项所对应的词槽,即选择成功以后会加入到解析结果中的词槽信息,如:{"user_movie": "花样年华1998"} |
remember | bool | optional,是否对当前结果进行记录,解析相同query时,默认选择同一结果 |
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
error_code | int | 错误码,为0时表示成功 |
error_msg | string | 错误信息,errno!= 0 时存在 |
result | object | 返回数据对象,当errno为0时有效 |
+version | string | =2.0,当前api版本对应协议版本号为2.0,固定值 |
+service_id | string | 机器人ID,同请求参数 |
+log_id | string | 日志唯一ID(用户与机器人的一问一答为一次interaction,其中用户每说一次对应有一个log_id) |
+session 或 session_id | string 或string(json) | 本轮对话后更新的session信息,具体为哪个字段,与请求数据有关,详情见【请求参数详细说明】 |
+dialog_state | object | 对话状态数据,外提以方便session托管。 |
+interaction_id | string | 为本轮请求+应答之组合,生成的id |
+timestamp | string | interaction生成的时间(以interaction_id的生成时间为准)。格式:YYYY-MM-DD HH:MM:SS.fff (24小时制,精确到毫秒) |
+response_list | list<object> | 本轮应答列表。由于请求接口支持请求多个技能,因此这里可能有多个应答。应答列表是有序的,其第一个元素是最为推荐采用的一个应答。决定应答列表顺序的规则详见【响应参数详细说明】 |
+response_list[].status | int | 状态码,0为正常 |
+response_list[].msg | string | 错误信息,非零时有效 |
+response_list[].origin | string | 应答来自哪个技能(skill_id)或机器人(service_id),注意有些应答可能是机器人给出的(不来自任何一个技能)。 |
+response_list[].action_list | list<object> | 动作列表 |
+response_list[].action_list[].confidence | float | 动作置信度 |
+response_list[].action_list[].action_id | string | 动作ID |
+response_list[].action_list[].say | string | 应答话术 |
+response_list[].action_list[].custom_reply | string(json) | 用户自定义应答,如果action_type为event,对应事件定义在此处。详见【响应参数详细说明】 |
+response_list[].action_list[].type | string enum |
动作类型,具体有以下几种: clarify(澄清) satisfy(满足) guide(引导到对话意图) faqguide(引导到问答意图) understood(理解达成,注:内部使用) failure(理解失败) chat(聊天话术) event(触发事件,在答复型对话回应 中选择了"执行函数",将返回event类型的action) |
+response_list[].action_list[].refine_detail | object optional |
澄清与引导(type=clarify/guide/faqguide)时有效,表达澄清或引导的详细信息。 |
+response_list[].action_list[].refine_detail.interact | string enum |
交互形式。具体有以下几种: select(给出选项供选择) ask(提问) selectandask(给出选项并且追加提问) |
+response_list[].action_list[].refine_detail.option_list | list<object> | 选项列表。 |
+response_list[].action_list[].refine_detail.option_list[].option | string | 选项文字 |
+response_list[].action_list[].refine_detail.option_list[].info | kvdict | 选项细节信息。详见【响应参数详细说明】 |
+response_list[].action_list[].refine_detail.clarify_reason | string enum optional |
动作类型为clarify时有值,表明起因 |
+response_list[].schema | object | 解析的schema,解析意图、词槽结果都从这里面获取 |
+response_list[].schema.confidence | double | schema的总体置信度 |
+response_list[].schema.intent | string | 意图 |
+response_list[].schema.intent_confidence | double | 意图置信度 |
+response_list[].schema.slots | list<object> | 词槽列表 |
+response_list[].schema.slots[].confidence | double | 词槽置信度 |
+response_list[].schema.slots[].begin | int | 起始位置 |
+response_list[].schema.slots[].length | int | 长度 |
+response_list[].schema.slots[].original_word | string | 词槽值 |
+response_list[].schema.slots[].normalized_word | string | 归一化词槽值 |
+response_list[].schema.slots[].word_type | string | 词槽值细化类型[保留字段] |
+response_list[].schema.slots[].name | string | 词槽名称 |
+response_list[].schema.slots[].session_offset | int | 词槽是在第几轮对话中引入的 |
+response_list[].schema.slots[].merge_method | string | 词槽引入的方式 |
+response_list[].schema.slots[].sub_slots | list<object> optional |
子词槽list,内部结构同正常词槽。 |
+response_list[].qu_res | object optional |
SLU解析结果,之所以是optional,是因为response不一定是由某个技能产生,因此不一定有SLU结果 |
+response_list[].qu_res.timestamp | int | query结果时间戳 |
+response_list[].qu_res.status | int | query结果状态 |
+response_list[].qu_res.raw_query | string | 原始query |
+response_list[].qu_res.candidates | list<object> | 意图候选项 |
+response_list[].qu_res.candidates[].confidence | double | 解析结果整体的(综合意图和词槽)置信度,如果返回结果中无该字段,请重新训练后尝试。 |
+response_list[].qu_res.candidates[].intent | string | 候选项意图名称 |
+response_list[].qu_res.candidates[].intent_confidence | double | 候选项意图置信度 |
+response_list[].qu_res.candidates[].intent_need_clarify | bool | 意图是否需要澄清 |
+response_list[].qu_res.candidates[].slots | list<object> | 词槽列表 |
+response_list[].qu_res.candidates[].slots[].confidence | double | 词槽置信度 |
+response_list[].qu_res.candidates[].slots[].begin | int | 起始位置,注意:单位为字符 |
+response_list[].qu_res.candidates[].slots[].length | int | 长度,注意:单位为字符 |
+response_list[].qu_res.candidates[].slots[].original_word | string | 词槽原始值 |
+response_list[].qu_res.candidates[].slots[].normalized_word | string(json) | 词槽归一化值 |
+response_list[].qu_res.candidates[].slots[].word_type | string | 细粒度词槽类型(预留字段) |
+response_list[].qu_res.candidates[].slots[].name | string | 词槽名 |
+response_list[].qu_res.candidates[].slots[].need_clarify | bool | 词槽是否需要澄清 |
+response_list[].qu_res.candidates[].slots[].father_idx | int | 父词槽index,非子词槽,取值-1 |
+response_list[].qu_res.candidates[].from_who | string | 来自哪个qu策略(smart-qu对应对话模板,ml-qu对应对话样本学习) |
+response_list[].qu_res.candidates[].match_info | string | query匹配信息 |
+response_list[].qu_res.candidates[].extra_info | kvdict | 候选项附加信息 |
+response_list[].qu_res.qu_res_chosen | string(json) | 最终qu结果,内部格式同result.response.qu_res.candidates[] |
+response_list[].qu_res.lexical_analysis | list<object> | query的词法分析结果 |
+response_list[].qu_res.lexical_analysis[].term | string | 词汇(含命名实体) |
+response_list[].qu_res.lexical_analysis[].weight | double | 重要性权重 |
+response_list[].qu_res.lexical_analysis[].type | string | 词性或专名类别 |
+response_list[].qu_res.lexical_analysis[].etypes | list<string> | 命名实体兼属的所有专名类别 |
+response_list[].qu_res.lexical_analysis[].basic_word | list<string> | 构成词汇的基本词 |
+response_list[].qu_res.sentiment_analysis | object | query的情感分析结果 |
+response_list[].qu_res.sentiment_analysis.label | string enum |
情感标签,取值范围:"0"、"1"、"2",分别代表:负向情感、无情感、正向情感 |
+response_list[].qu_res.sentiment_analysis.pval | double | 置信度,取值范围0-1 |
响应参数详细说明
response_list的排序规则
排序分为三轮完成。
第一轮:如果请求中传递了skill_ids,按照skill_ids的顺序排列。否则,按照机器人配置的技能优先级排列。
第二轮:从前到后遍历第一轮排序结果:
如果某个技能应答的action_list[0].id与其上一轮应答(如有)相同,且action_list[0].type为"clarify",该技能的应答移到末尾。
本轮排序的目的是避免低优先级技能对新请求的有效应答被高优先级技能的重复澄清覆盖掉。
第三轮:从前到后遍历第二轮排序结果
如果某个技能的action_list[0].type为failure,该技能的应答移到末尾。
注:UNIT网站的机器人对话体验窗口中,每次对话展现的是response_list的第一个应答,在新一轮请求中记忆产出该应答的技能session。
response_list[].action_list[].custom_reply
- 用户自定义应答,如果action_type为event,对应事件定义在此处。
- 这里预定义一个event,对应『执行函数』动作:
Key | 类型 | 说明 |
---|---|---|
event_name | string | =EXEC |
func | string | 具体执行函数 |
result.response.action_list[].refine_detail.option_list[].info
这个字段是一个kvdict,我们预定义2种格式:
- result.response.action_list[].type 为 clarify 时
Key | 类型 | 说明 |
---|---|---|
name | string | 意图、词槽的英文名 |
text | string | 意图、词槽的中文描述 |
value | string optional |
词槽值(仅针对词槽) |
- result.response.action_list[].type 为 guide/faqguide 时
Key | 类型 | 说明 |
---|---|---|
next_expect_intent | String | 下一意图 |
请求示例代码
提示一:使用示例代码前,请记得替换其中的示例Token、请求参数等信息。
提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。
package com.baidu.ai.aip.unit;
import com.baidu.ai.aip.utils.HttpUtil;
/*
* unit对话服务
*/
public class UnitService {
/**
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/
private static String utterance() {
// 请求URL
String talkUrl = "https://aip.baidubce.com/rpc/2.0/unit/service/chat";
try {
// 请求参数
String params = "{\"log_id\":\"UNITTEST_10000\",\"version\":\"2.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"request\":{\"query\":\"你好\",\"user_id\":\"88888\"},\"dialog_state\":{\"contexts\":{\"SYS_REMEMBERED_SKILLS\":[\"1057\"]}}}";
String accessToken = "#####调用鉴权接口获取的token#####";
String result = HttpUtil.post(talkUrl, accessToken, "application/json", params);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
utterance();
}
}
/*
* Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
*/
var https = require('https');
var qs = require('querystring');
var param = qs.stringify({
'access_token': '您的access_token'
});
var options = {
hostname: 'aip.baidubce.com',
path: '/rpc/2.0/unit/service/chat?' + param,
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=UTF-8'
}
};
var req = https.request(
options,
function (res) {
// 在标准输出中查看运行结果
res.pipe(process.stdout);
}
);
var postData = {
'log_id': 'UNITTEST_10000',
'version': '2.0',
'service_id': 'S10000',
'session_id': '',
'request': {
'query': '你好',
'user_id': '88888'
},
'dialog_state': {
'contexts': {
'SYS_REMEMBERED_SKILLS': ['1057']
}
}
};
// 携带数据发送https请求
req.write(JSON.stringify(postData));
req.end();
<?php
/**
* 发起http post请求(REST API), 并获取REST请求的结果
* @param string $url
* @param string $param
* @return - http response body if succeeds, else false.
*/
function request_post($url = '', $param = '')
{
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
// 初始化curl
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $postUrl);
curl_setopt($curl, CURLOPT_HEADER, 0);
// 要求结果为字符串且输出到屏幕上
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// post提交方式
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
// 运行curl
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
$token = '#####调用鉴权接口获取的token#####';
$url = 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=' . $token;
$bodys = '{"log_id":"UNITTEST_10000","version":"2.0","service_id":"S10000","session_id":"","request":{"query":"你好","user_id":"88888"},"dialog_state":{"contexts":{"SYS_REMEMBERED_SKILLS":["1057"]}}}';
$res = request_post($url, $bodys);
var_dump($res);
# encoding:utf-8
import requests
access_token = '#####调用鉴权接口获取的token#####'
url = 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=' + access_token
post_data = "{\"log_id\":\"UNITTEST_10000\",\"version\":\"2.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"request\":{\"query\":\"你好\",\"user_id\":\"88888\"},\"dialog_state\":{\"contexts\":{\"SYS_REMEMBERED_SKILLS\":[\"1057\"]}}}"
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(url, data=post_data, headers=headers)
if response:
print (response.json())
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;
using System.Net.Http;
namespace com.baidu.ai
{
public class Utterance
{
// unit对话接口
public static string unit_utterance()
{
string token = "#####调用鉴权接口获取的token#####";
string host = "https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=" + token;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
string str = "{\"log_id\":\"UNITTEST_10000\",\"version\":\"2.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"request\":{\"query\":\"你好\",\"user_id\":\"88888\"},\"dialog_state\":{\"contexts\":{\"SYS_REMEMBERED_SKILLS\":[\"1057\"]}}}"; // json格式
byte[] buffer = Encoding.UTF8.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string result = reader.ReadToEnd();
Console.WriteLine("对话接口返回:");
Console.WriteLine(result);
return result;
}
}
}
#include <iostream>
#include <curl/curl.h>
// libcurl库下载链接:https://curl.haxx.se/download.html
// unit对话接口url
const static std::string get_utterance_url = "https://aip.baidubce.com/rpc/2.0/unit/service/chat";
static std::string s_get_utterance_result;
/**
* curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
* @param 参数定义见libcurl文档
* @return 返回值定义见libcurl文档
*/
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
// 获取到的body存放在ptr中,先将其转换为string格式
s_get_utterance_result = std::string((char *) ptr, size * nmemb);
return size * nmemb;
}
/**
* 调用对话接口,返回int格式的结果,具体格式解析见百度大脑文档
* @param json_result 以string格式返回的json格式的结果
* @param json_request_body 以string格式传递的json数据(如:{"log_id":"UNITTEST_10000","version":"2.0","service_id":"S10000","session_id":"","request":{"query":"你好","user_id":"88888"},"dialog_state":{"contexts":{"SYS_REMEMBERED_SKILLS":["1057"]}}}; // json格式 )
* @param access_token 以string格式传入的access token数据,access token获取方式见access_token获取相关文档及代码
* @return 调用成功返回0,发生错误返回其他错误码
*/
int unit_utterance(std::string &json_result, const std::string json_request_body,
const std::string &access_token) {
std::string url = get_utterance_url + "?access_token=" + access_token;
CURL *curl = NULL;
CURLcode result_code;
int is_success = 0;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.data());
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_request_body.data());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
result_code = curl_easy_perform(curl);
if (result_code != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(result_code));
is_success = 1;
return is_success;
}
json_result = s_get_utterance_result;
curl_easy_cleanup(curl);
is_success = 0;
} else {
fprintf(stderr, "curl_easy_init() failed.");
is_success = 1;
}
return is_success;
}
#!/bin/bash
curl -i -k 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token={access_token}' --data '{"log_id":"robotTest_12345","version":"2.0","service_id":"S10000","session_id":"","request":{"query":"你好","user_id":"88888"},"dialog_state":{"contexts":{"SYS_REMEMBERED_SKILLS":["1057"]}}}'
错误信息
错误码 | 类型 | 说明 |
---|---|---|
1 | Unknown error | 系统繁忙,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |
2 | Service temporarily unavailable | 服务暂不可用,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |
3 | Unsupported openapi method | 调用的API不存在,请检查后重新尝试 |
4 | Open api request limit reached | 集群超限额 |
6 | No permission to access data | 无权限访问该用户数据 |
17 | Open api daily request limit reached | 每天请求量超限额,如需更多配额请通过工单系统提交申请 |
18 | Open api qps request limit reached | QPS超限额,如需更多配额请通过工单系统提交申请 |
19 | Open api total request limit reached | 请求总量超限额,如需更多配额请通过工单系统提交申请 |
100 | Invalid parameter | 无效的access_token参数,请检查后重新尝试 |
110 | Access token invalid or no longer valid | access_token无效 |
111 | Access token expired | access_token过期 |
282000 | Internal error | 系统繁忙,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |
282001 | Strategy process failed | 系统内部错误,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |
282004 | Parameter[%s] invalid or missing | 请求参数格式不正确 |
282008 | The request content type is illegal. | 非法请求内容类型 |
282906 | The account cannot use the service | 账户请求服务受限,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |
292001~292015 | - | 请求参数错误,详见errorMsg字段描述 |
299001~299999 | - | 系统繁忙,如果持续出现该错误,请通过QQ群(1074410189)或百度Hi群(1617262)联系技术支持团队 |