对话API接口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 编码
- 输入、输出中,所有begin、length字段的单位为字符(编码无关)
对话接口描述
基于用户输入的文本内容(语音输入最终也转为文本),返回机器人理解与应答的信息。调用本对话API的前提是您已经在 unit.baidu.com 创建了机器人,并添加了至少一个已定义过的技能(新建了对话意图或问答意图、添加了对话模板/对话样本,且最少完成了一次模型的训练)。营销线索机器人只支持使用2.0接口调用。
请求说明
HTTP方法:POST
请求URL:
- 研发环境
【不区分机房】https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat - 生产环境
【华北机房】https://unit.bj.baidubce.com/rpc/2.0/unit/service/v3/chat
【华东机房】https://unit.su.baidubce.com/rpc/2.0/unit/service/v3/chat
【华南机房】https://unit.gz.baidubce.com/rpc/2.0/unit/service/v3/chat
【全国域名】https://unit-api.baidu.com/rpc/2.0/unit/service/v3/chat - 注意:
- 生产环境域名需将技能部署到生产环境后才可使用。
- 若多技能有生产环境,建议购买、部署到同一机房。
- 全国域名还在开发中,目前支持华北机房,若有其他需求,可与客服沟通。
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/json |
Body中放置请求参数,参数详情如下:
请求参数说明
参数 | 类型 | 是否必需 | 说明 |
---|---|---|---|
version | string | 必需 | =3.0,当前api版本对应协议版本号为3.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_id | string | 必需 | session保存机器人的历史会话信息,由机器人创建,客户端从上轮应答中取出并直接传递,不需要了解其内容。如果为空,则表示清空session(开发者判断用户意图已经切换且下一轮会话不需要继承上一轮会话中的词槽信息时可以把session置空,从而进行新一轮的会话)。 开发者可以通过传送session_id的方式实现多轮对话。具体操作方式见【请求参数详细说明】 |
context | object | 可选 | 希望在多技能对话过程中贯穿的全局性上下文. 这里预留了一个key用于控制各技能的session记忆。详见【请求参数详细说明】 |
request | object | 必需 | 本轮请求体。 |
+terminal_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 | 可选 | 语音输入候选置信度,取值范围[0,100] |
+client_options | list<object> | 可选 | 用于在多轮中实现多选一的对话效果,具体内容见【请求参数详细说明】 |
+updates | object | 可选 | 干预信息。详情见【请求参数详细说明】 |
++type | string | 可选 | 干预方式,支持「DEFINE」和「MODIFY」两种方式。其中「DEFINE」表明抛弃系统解析结果,转而由updates字段来定义;「MODIFY」表明在已解析的结果上进行修改 |
++ops | list<object> | 可选 | 干预操作集。 |
++ops[].op | string | 可选 | 操作方式。当type为「DEFINE」时,支持「DEFINE」。当type为「MODIFY」时,支持「ADD」(添加)、「REMOVE」(删除)两种方式 |
++ops[].target | string | 可选 | 操作针对的对象,可选值为意图(INTENT)、词槽(SLOT) |
++ops[].value | object | 可选 | 操作对象的值 |
+hyper_params | object | 可选 | 控制相关技能/机器人内部行为的的超参数 |
++slu_tags | list<string> | 可选 | 用于限定slu的解析范围,只在打上了指定tag的意图、或问答对的范围内执行slu |
++dynamic_slots | kvdict of list<string> | 可选 | 针对特定词槽启用『动态词典』机制,key为词槽名(如user_xxx),value为针对该词槽启用的动态词典id(可以同时启用多个动态词典)。 |
++local_time | string | 可选 | 当前当地时间,用于计算例如:“3小时后”此类问法的基准时间。为空默认北京时间。参数格式示例:2020-9-22T11:11:11 |
++chat_req_cnt | int | 可选 | 闲聊技能中使用--控制返回的回复数目,取值范围1~10 |
++chat_default_bot_profile | int | 可选 | 闲聊技能中使用--是否启用系统画像服务,0:关闭;1:打开 |
++chat_service_strict | int | 可选 | 闲聊技能中使用--是否开启儿童聊天模式,0:关闭;1:打开 |
++chat_custom_bot_profile | int | 可选 | 闲聊中使用--是否启用自定义画像(单轮闲聊不支持,启用自定义画像时,需关闭系统画像服务,否则不生效;),0:关闭,1:打开 |
++chat_style | string | 可选 | 闲聊中使用--闲聊对话风格选择(单轮闲聊不支持),lively: 活泼风格,cool: 冷酷风格,ancient: 古风风格,不使用该参数时默认无风格 |
请求参数详细说明
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。
总结起来,开发者可以使用以下方式与机器人对话API进行多轮对话:
- 客户端在首轮会话时以“session_id”为key传入一个空串,UNIT会把会话数据托管在云端,在应答中以“session_id”为key,返回一个用于指代云端的会话数据的ID号。如需进行多轮对话,客户端在后续对话中以“session_id”为key,继续传送前轮返回的ID号。在这种方式下,开发者没有办法修改会话数据。
注意:
- 只要传入一个空的session_id,即代表不再继承历史会话信息,后续将开始新的对话。
- session_id的有效期为30分钟,多轮对话间隔超过30分钟需重新开始对话。
context
context字段以一个开放的json对象存储所有与对话相关的上下文信息。我们当前预留了一个key,用于开发者控制各个技能的session记忆,如下表:
key | type | 说明 |
---|---|---|
SYS_REMEMBERED_SKILLS | list<string> | 1、如果本次请求没有携带context.SYS_REMEMBERED_SKILLS,则默认进行全技能多轮对话; 2、如果本次请求携带了context.SYS_REMEMBERED_SKILLS,则仅对该部分技能进行多轮对话,其余技能则作为首轮进行对话。传递空列表表示全部技能都作为首轮进行对话。 3、taskflow型机器人所有技能均为单轮对话,该字段无效。 |
SYS_CHAT_HIST | list<string> | 本字段主要用于保存多轮闲聊技能的历史对话信息,最多保存7轮对话 1、如果用户不传递context.SYS_CHAT_HIST字段,则默认使用系统保存的闲聊对话历史进行多轮对话; 2、如果用户传递context.SYS_CHAT_HIST,则需要按照["问句1","答句1"..."问句n"]的方式,传递闲聊对话历史,最多传递7轮,传入的最后一个问句需要与query一致。 3、普通版闲聊不支持多轮,该字段不生效。 |
SYS_CHAT_HIST参数使用示例格式:
- SYS_CHAT_HIST中传入的最后一个问句需要与query一致。比如:第一轮,query是“你好”,SYS_CHAT_HIST传入“你好”;第二轮,query是“今天天气怎样”,SYS_CHAT_HIST传入的是“你好”“你也好啊”“今天天气怎样”这三条数据。
"context": {
"SYS_REMEMBERED_SKILLS": [],
"SYS_CHAT_HIST": [
"问句1",
"回复1",
"问句2",
"回复2",
"问句3"
]
}
request.terminal_id
- 开发者为其用户分配的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,其他自便。
request.client_options
request.client_options:用于在多轮中实现多选一的对话效果,查看详细使用说明。
key | 类型 | 说明 |
---|---|---|
client_options | list<object> | 存储client端提供的候选项列表,每个候选项对应一个object。 |
client_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"
},
}
对于每个候选项,attributes、slot_updates两个key,分别说明如下:
key | 类型 | 说明 |
---|---|---|
attributes | object | 一组kv,记录该候选的若干属性及属性值,attr_name可自行设定,attr_value支持int、float和string类型的值,如:{"movie_name":"花样年华", "year":1998, "actor":"梁朝伟"} |
slot_updates | object | 用户提供的候选项所对应的词槽,即选择成功以后会加入到解析结果中的词槽信息,如:{"user_movie": "花样年华1998"} |
request.updates
request.updates:干预操作信息
- target为INTENT时,value为一个string,代表要干预的意图。
-
target为SLOT时,value为一个object,代表要干预的词槽:
- op当前支持DEFINE,ADD,REMOVE三种方式(当updates.type为「DEFINE」时,支持「DEFINE」;当updates.type为「MODIFY」时,支持「ADD」,「REMOVE」),value格式为:
-
当op为「DEFINE」或「ADD」时,value格式为:
key 类型 说明 original_word string 词槽值 normalized_word string 归一化后的词槽值(标准表达) name string 词槽名 begin int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 length int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 -
当op为「REMOVE」时,根据index_mode参数取值的不同,value格式有以下两种为:
- 当index_mode为SPAN时,value格式为:
key 类型 说明 index_mode string
enumindex_mode取值SPAN begin int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 length int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 - 当index_mode为NAME时,value格式为:
key 类型 说明 index_mode string
enumindex_mode取值NAME name string 词槽名
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
error_code | int | 错误码,为0时表示成功 |
error_msg | string | 错误信息,errno!= 0 时存在 |
result | object | 返回数据对象,当errno为0时有效 |
+version | string | =3.0,当前api版本对应协议版本号为3.0,固定值 |
+service_id | string | 机器人ID,同请求参数 |
+skill_ids | list<string> | 如果请求中传递了skill_ids,则响应参数值技能ID顺序按照skill_ids的顺序排列 |
+log_id | string | 开发者需要在客户端生成的唯一id,用来定位请求,响应中会返回该字段。对话中每轮请求都需要一个log_id |
+session_id | string | 本轮对话后更新的session_id信息,详情见【请求参数详细说明】 |
+timestamp | string | interaction生成的时间(以interaction_id的生成时间为准)。格式:YYYY-MM-DD HH:MM:SS.fff (24小时制,精确到毫秒) |
+ref_id | string | 每轮对话自动生成的唯一ID |
+responses | list<object> | 本轮应答列表。由于请求接口支持请求多个技能,因此这里可能有多个应答。应答列表是有序的,其第一个元素是最为推荐采用的一个应答。决定应答列表顺序的规则详见【响应参数详细说明】 |
+responses[].status | int | 状态码,0为正常 |
+responses[].msg | string | 错误信息,非零时有效 |
+responses[].origin | string | 应答来自哪个技能(skill_id)或机器人(service_id),注意有些应答可能是机器人给出的(不来自任何一个技能)。 |
+responses[].actions | list<object> | 动作列表 |
+responses[].actions[].action_id | string | 动作ID |
+responses[].actions[].say | string | 应答话术 |
+responses[].actions[].custom_reply | string(json) | 用户自定义应答,如果action_type为event,对应事件定义在此处。详见【响应参数详细说明】 |
+responses[].actions[].type | string enum |
动作类型,具体有以下几种: clarify(澄清) satisfy(满足) guide(引导到对话意图) faqguide(引导到问答意图) understood(理解达成,注:内部使用) failure(理解失败) chat(聊天话术) event(触发事件,在答复型对话回应 中选择了"执行函数",将返回event类型的action) |
+responses[].actions[].confidence | number | 动作置信度,取值范围[0,100] |
+responses[].actions[].options | list<object> | 选项列表。 |
+responses[].actions[].options[].option | string | 选项文字 |
+responses[].actions[].options[].info | kvdict | 选项细节信息。详见【响应参数详细说明】 |
+responses[].schema | object | 解析的schema,解析意图、词槽结果都从这里面获取 |
+responses[].schema.intents | list<object> | 意图列表 |
+responses[].schema.intents[].intent_name | string | 意图名称 |
+responses[].schema.intents[].intent_confidence | float | 意图置信度 |
+responses[].schema.intents[].slu_info | object | 单轮解析的详细信息 |
++slu_intent | string | 意图信息 |
++slu_tags | list |
匹配到的问题或模板的tag信息 |
++match_info | object | query匹配信息 |
+++from_who | string | 来自哪个qu策略(smart-qu对应对话模板,ml-qu对应对话样本学习) |
+++match_query | string | 问题匹配信息 |
+++match_template | object | 模板匹配信息 |
++++template_id | int | 模板ID |
++++match_pattern | string | 匹配到的模板片段信息 |
++++real_threshold | float | 真实阈值 |
++++threshold | float | 设定阈值 |
+response[].schema.intents[].slots | list<object> | 词槽列表 |
+response[].schema.intents[].slots[].slot_name | string | 词槽名称 |
+response[].schema.intents[].slots[].slot_values | list<object> | 词槽详细信息列表 |
++original_word | string | 词槽值 |
++normalized_word | string | 归一化词槽值 |
++confidence | float | 词槽置信度 |
++session_offset | int | 词槽是在第几轮对话中引入的 |
++begin | int | 起始位置 |
++length | int | 长度 |
++sub_slots | list<object> optional |
子词槽list,内部结构同正常词槽。 |
++merge_method | string | 词槽引入的方式 |
+responses[].raw_query | string | 原始query |
+responses[].sentiment_analysis | object | query的情感分析结果 |
+responses[].response[].qu_res | object | SLU解析的结果 |
+responses[].response[].qu_res.qu_res_chosen | object | 最终解析结果 |
+responses[].response[].qu_res.qu_candidates | list<object> | 解析结果候选项 |
+response[].slot_history | list<object> | 历史词槽结果 |
响应参数详细说明
response_list的排序规则
排序分为三轮完成。
第一轮:如果请求中传递了skill_ids,按照skill_ids的顺序排列。否则,按照机器人配置的技能优先级排列。
第二轮:从前到后遍历第一轮排序结果:
如果某个技能应答的actions[0].id与其上一轮应答(如有)相同,且actions[0].type为"clarify",该技能的应答移到末尾。
本轮排序的目的是避免低优先级技能对新请求的有效应答被高优先级技能的重复澄清覆盖掉。
第三轮:从前到后遍历第二轮排序结果
如果某个技能的actions[0].type为failure,该技能的应答移到末尾。
注:UNIT网站的机器人对话体验窗口中,每次对话展现的是responses的第一个应答,在新一轮请求中记忆产出该应答的技能session。
responses[].actions[].custom_reply
- 用户自定义应答,如果action_type为event,对应事件定义在此处。
- 这里预定义一个event,对应『执行函数』动作:
Key | 类型 | 说明 |
---|---|---|
event_name | string | =EXEC |
func | string | 具体执行函数 |
result.responses[].actions[].options[].info
这个字段是一个kvdict,我们预定义2种格式:
- result.response.actions[].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/v3/chat";
try {
// 请求参数
String params = "{\"version\":\"3.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"log_id\":\"7758521\",\"request\":{\"terminal_id\":\"88888\",\"query\":\"你好\"}}";
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/v3/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 = {
'version': '3.0',
'service_id': 'S10000',
'session_id': '',
'log_id': 'UNITTEST_10000',
'request': {
'query': '你好',
'terminal_id': '88888'
}
};
// 携带数据发送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/v3/chat?access_token=' . $token;
$bodys = '{"version":"3.0","service_id":"S10000","session_id":"","log_id":"7758521","request":{"terminal_id":"88888","query":"你好"}}';
$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/v3/chat?access_token=' + access_token
post_data = "{\"version\":\"3.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"log_id\":\"7758521\",\"request\":{\"terminal_id\":\"88888\",\"query\":\"你好\"}}"
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/v3/chat?access_token=" + token;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
string str = "{\"version\":\"3.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"log_id\":\"7758521\",\"request\":{\"terminal_id\":\"88888\",\"query\":\"你好\"}}"; // 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/v3/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数据(如:{\"version\":\"3.0\",\"service_id\":\"S10000\",\"session_id\":\"\",\"log_id\":\"7758521\",\"request\":{\"terminal_id\":\"88888\",\"query\":\"你好\"}}; // 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/v3/chat?access_token={access_token}' --data '{"version":"3.0","service_id":"S10000","session_id":"","log_id":"7758521","request":{"terminal_id":"88888","query":"你好"}}'
错误信息
错误码 | 类型 | 说明 |
---|---|---|
1 | Unknown error | 系统繁忙,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
2 | Service temporarily unavailable | 服务暂不可用,如果持续出现该错误,请通过QQ群(805312106)或百度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群(805312106)或百度Hi群(1617262)联系技术支持团队 |
282001 | Strategy process failed | 系统内部错误,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
282004 | Parameter[%s] invalid or missing | 请求参数格式不正确 |
282008 | The request content type is illegal. | 非法请求内容类型 |
282906 | The account cannot use the service | 账户请求服务受限,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
292001~292015 | - | 请求参数错误,详见errorMsg字段描述 |
299001~299999 | - | 系统繁忙,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |