技能对话API接口2.0
2.0版本已停止日常维护,建议使用3.0版本。
简介
Hi,您好,欢迎使用百度智能对话定制与服务平台(UNIT)技能对话API服务。
本文档主要针对API开发者,描述百度智能对话定制与服务平台技能对话接口服务的相关内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
- 在百度云控制台内提交工单,工单类型请选择人工智能-智能对话定制与服务平台UNIT服务;
- 进入UNIT开发者论坛发帖交流;
文档约定
参数结构约定
| 示例 | 说明 | 
|---|---|
| + | "+"号表示字段层级,首层为第0层级 | 
| aaa[].bbb | aaa是一个list,bbb是list中的一个元素的属性 | 
| enum | 枚举值 | 
| optional | 用于描述应答参数,表明某个参数在应答中不一定存在 | 
- 所有参数都使用 UTF8 编码
- 输入、输出中,所有offset、begin、length字段的单位为字符(编码无关)
对话接口描述
基于用户输入的文本内容(语音输入最终也转为文本),返回技能理解与应答的信息。调用本对话API的前提是您已经在unit.baidu.com 已经创建了技能,并定义了技能(新建了对话意图或问答意图)、添加了对话模板/对话样本,且最少完成了一次模型的训练。
请求说明
HTTP方法:POST
请求URL:
- 沙盒环境
 【不区分机房】https://aip.baidubce.com/rpc/2.0/unit/bot/chat
- 生产环境
 【华北机房】https://unit.bj.baidubce.com/rpc/2.0/unit/bot/chat
 【华东机房】https://unit.su.baidubce.com/rpc/2.0/unit/bot/chat
 【华南机房】https://unit.gz.baidubce.com/rpc/2.0/unit/bot/chat
 【全国域名】https://unit-api.baidu.com/rpc/2.0/unit/bot/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 | 
| bot_id | string | 必需 | 技能唯一标识,在『我的技能』的技能列表中的技能ID,详情见【请求参数详细说明】 | 
| log_id | string | 必需 | 开发者需要在客户端生成的唯一id,用来定位请求,响应中会返回该字段。对话中每轮请求都需要一个log_id | 
| 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 | 可选 | 语音输入候选置信度 | 
| +bernard_level | int | 必需 | 系统自动发现不置信意图/词槽,并据此主动发起澄清确认的频率。取值范围:0(关闭)、1(低频)、2(高频)。取值越高代表技能对不置信意图/词槽的敏感度就越高,建议值为1 | 
| +client_session | string(json) | 可选 | 用于在多轮中实现多选一的对话效果。详情见【请求参数详细说明】 | 
| +updates | string(json) | 可选 | 干预信息。详情见【请求参数详细说明】 | 
| ++type | string | 可选 | 干预方式,当前只能取『DEFINE』,表明抛弃系统解析结果,转而由updates字段来定义 | 
| ++ops | list<object> | 可选 | 干预操作集。 | 
| ++ops[].op | string | 可选 | 操作方式,当前只能取『DEFINE』,表明定义一个对象 | 
| ++ops[].target | string | 可选 | 操作针对的对象,可选值为意图(INTENT)、词槽(SLOT) | 
| ++ops[].value | object | 可选 | 操作对象的值 | 
| +hyper_params | object | 可选 | 影响UNIT内部行为的超参数 | 
| float | 可选 | 参数已废弃 | |
| int | 可选 | 参数已废弃 | |
| ++slu_tags | list<string> | 可选 | 用于限定slu的解析范围,只在打上了指定tag的意图、或问答对的范围内执行slu | 
| ++dynamic_slots | kvdict of list<string> | 可选 | 针对特定词槽启用『动态词典』机制,key为词槽名(如user_xxx),value为针对该词槽启用的动态词典id(可以同时启用多个动态词典)。 | 
| ++slu_only | int | 可选 | 取非零值时,对话技能将只运行对话理解部分,以便更好地与外置的对话管理技术(如DMKit、Taskflow)配合。问答技能和遗留在旧版对话技能中的FAQ问答能力,不受此参数影响。 | 
| bot_session | string(json) | 必需 | 技能的session信息,由技能创建,client从上轮应答中取出并直接传递,不需要了解其内容。如果为空,则表示清空session(开发者判断用户意图已经切换且下一轮会话不需要继承上一轮会话中的词槽信息时可以把session置空,从而进行新一轮的会话)。传参时可只传session_id。 以下为bot_session内部格式,仅供参考了解 | 
| +session_id | string | 必需 | 会话ID | 
| +bot_views | object | 可选 | 技能视图数据(意图、词槽解析的历史与最新结果),一般是与交互元素相关但无直接对应关系,需要推演得出的数据。这种数据在此处缓存,可节约计算开销 | 
| +dialog_state | object | 可选 | 对话状态数据,供本地化对话管理模块(如DMKit)使用 | 
| +interactions | list<object> | 可选 | 历史交互序列,即历史 request/response 序列,序列的每一个元素称作一次交互(interaction),随交互进行而交替插入,格式与上述不断增长直到发生清空操作 | 
| +interactions[].interaction_id | string | 可选 | 第 i 次交互的唯一标识 | 
| +interactions[].request | object | 可选 | 第 i 次交互的 request,结构参考【请求参数说明】中的request | 
| +interactions[].response | object | 可选 | 第 i 次交互的 response,结构参考【响应参数说明】中的response | 
请求参数详细说明
bot_id
- 登录unit.baidu.com,新建技能后在【我的技能】列表中可看到技能ID,如下图:
request.user_id
- 开发者为其用户分配的id,用于区别开发者的每个最终用户。
- UNIT保留两种形式的id,开发者在为最终用户分配id时应当避免分配这些形式的id。
| ID形式 | 说明 | 
|---|---|
| UNITWEB* | 用于标识来自UNIT网站对话窗口的请求。形式为UNITWEB + 技能ID/机器人ID | 
| UNITDEV* | 用于标识来自开发者自己的请求。形式为UNITDEV + 任意后缀(一个好的选择是使用开发者的百度id作为后缀) | 
request.query_info
request.query:本轮请求query
- query_info.type为TEXT时,为常规的文本型query
- query_info.type为EVENT时,代表query是一个事件,事件为一组K-V(json),且其中必须包含一个名为『event_name』的key,其他自便。
- 
我们预定义三种event_name及对应的数据格式: "CHOOSE","@UNIT"和"RESET" - 
CHOOSE:用户点击了一个界面选择项,比如用户选择技能让用户澄清的多个选项中的一个,技能:有两首您想听的歌,你想听哪首--1……,2……;USER:第1首。 key 类型 说明 event_name string =CHOICE interaction_id string 选项来自哪个interaction_id(会由技能返回) index string 点击了第几个选项(从1开始) 
- 
@UNIT:发起对上轮意图/词槽/问答对的干预 key 类型 说明 event_name string =@UNIT (此处不需要其他数据,干预信息从updates字段传入) - - (通过@UNIT和updates字段配合传入的干预信息会被平台记录下来,可以在 对话日志→反馈学习界面中查看和操作。注意,updates字段传入的干预信息要和当前模型版本的schema一致,否则不保证结果的正确性。)
- 
RESET:清空session,即重置会话状态,会清空当前技能已存储的意图与词槽信息。 key 类型 说明 event_name string =RESET 
 
- 
request.updates
request.updates:干预操作信息
- target为INTENT时,value为一个string,代表要干预的意图。
- 
target为SLOT时,value为一个object,代表要干预的词槽: - 
op当前仅支持DEFINE,value格式为: key 类型 说明 begin int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 length int 如果是query中不包含的词槽(如GPS位置信息等),取值-1 original_word string 词槽值 normalized_word string 归一化后的词槽值(标准表达) word_type string 预留字段 name string 词槽名 
 
- 
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时,默认选择同一结果 | 
利用session_id实现多轮对话
bot_session.session_id:会话ID
- 历史会话信息bot_session会在平台中保留30分钟
- 
当前请求中的bot_session.session_id与保留中的某个会话相同时,当前会话将继承历史会话的意图和词槽信息以及对话状态,来实现多轮对话。 - 您可以单独上轮响应的session_id值,bot_session字段的类型是string,传入K-V结构的数据需要先转化成json字符串,然后需要对该json字符串转义成string类型后传入该字段,例如:"bot_session": "{\"session_id\":\"value\"}"
- 也可以传入上轮响应的bot_session值,上轮响应的bot_session值已经是转义好的数据,不需要开发者再次进行转义。
 
- 您可以单独上轮响应的session_id值,bot_session字段的类型是string,传入K-V结构的数据需要先转化成json字符串,然后需要对该json字符串转义成string类型后传入该字段,例如:
- 当前请求中的bot_session.session_id无法从历史会话信息中匹配到相同结果时,将开启一次新的会话。
响应参数说明
| 参数 | 类型 | 说明 | 
|---|---|---|
| error_code | int | 错误码,为0时表示成功 | 
| error_msg | string | 错误信息,errno!= 0 时存在 | 
| result | object | 返回数据对象,当errno为0时有效 | 
| +version | string | =2.0,当前api版本对应协议版本号为2.0,固定值 | 
| +bot_id | string | 技能ID,同请求参数 | 
| +log_id | string | 日志唯一ID(用户与技能的一问一答为一次interaction,其中用户每说一次对应有一个log_id),同输入参数 | 
| +bot_session | string(json) | 本轮对话后更新的session信息,同请求参数 | 
| +interaction_id | string | 为本轮请求+应答之组合,生成的id | 
| +response | object | 本轮应答体 | 
| ++status | int | 状态码,0为正常 | 
| ++msg | string | 错误信息,非零时有效 | 
| ++action_list | list<object> | 动作列表 | 
| ++action_list[].confidence | float | 动作置信度 | 
| ++action_list[].action_id | string | 动作ID | 
| ++action_list[].say | string | 应答话术 | 
| ++action_list[].custom_reply | string(json) | 用户自定义应答,如果action_type为event,对应事件定义在此处 | 
| ++action_list[].type | string enum | 动作类型,具体有以下几种: clarify(澄清) satisfy(满足) guide(引导到对话意图) faqguide(引导到问答意图) understood(理解达成,注:内部使用) failure(理解失败) chat(聊天话术) event(触发事件,在答复型对话回应中选择了"执行函数",将返回event类型的action) | 
| ++action_list[].refine_detail | object optional | 澄清与引导(type=clarify/guide/faqguide)时有效,表达澄清或引导的详细信息。 | 
| ++action_list[].refine_detail.interact | string enum | 交互形式。具体有以下几种: select(给出选项供选择) ask(提问) selectandask(给出选项并且追加提问) | 
| ++action_list[].refine_detail.option_list | list<object> | 选项列表。 | 
| ++action_list[].refine_detail.option_list[].option | string | 选项文字 | 
| ++action_list[].refine_detail.option_list[].info | kvdict | 选项细节信息。详见【响应参数详细说明】 | 
| ++action_list[].refine_detail.clarify_reason | string enum optional | 动作类型为clarify时有值,表明起因 | 
| ++schema | object | 解析的schema,解析意图、词槽结果都从这里面获取 | 
| +++intent | string | 意图 | 
| +++intent_confidence | float | 意图置信度 | 
| +++domain_confidence | float | domain分类置信度[已废弃] | 
| +++slots | list<object> | 词槽列表 | 
| +++slots[].confidence | float | 词槽置信度 | 
| +++slots[].begin | int | 词槽起始 | 
| +++slots[].length | int | 词槽长度 | 
| +++slots[].original_word | string | 词槽值 | 
| +++slots[].normalized_word | string | 归一化词槽值 | 
| +++slots[].word_type | string | 词槽值细化类型[保留字段] | 
| +++slots[].name | string | 词槽名称 | 
| +++slots[].session_offset | int | 词槽是在第几轮对话中引入的 | 
| +++slots[].merge_method | string | 引入的方式 | 
| +++slots[].sub_slots | list<object> optional | 子词槽list,内部结构同正常词槽。 | 
| ++qu_res | object | SLU解析的结果 | 
| +++timestamp | int | query结果时间戳 | 
| +++status | int | query结果状态 | 
| +++raw_query | string | 原始query | 
| +++candidates | list<object> | 意图候选项 | 
| +++candidates[].confidence | float | 解析结果整体的(综合意图和词槽)置信度,如果返回结果中无该字段,请重新训练后尝试。 | 
| +++candidates[].intent | string | 候选项意图名称 | 
| +++candidates[].intent_confidence | float | 候选项意图置信度 | 
| +++candidates[].domain_confidence | float | 候选项domain分类置信度[已废弃] | 
| +++candidates[].intent_need_clarify | bool | 意图是否需要澄清 | 
| +++candidates[].slots | list<object> | 候选项词槽列表 | 
| +++candidates[].slots[].confidence | float | 词槽置信度 | 
| +++candidates[].slots[].begin | int | 起始位置,单位为字符 | 
| +++candidates[].slots[].length | int | 长度,单位为字符 | 
| +++candidates[].slots[].original_word | string | 词槽原始值 | 
| +++candidates[].slots[].normalized_word | string(json) | 词槽归一化值 | 
| +++candidates[].slots[].word_type | string | 细粒度词槽类型(预留字段) | 
| +++candidates[].slots[].name | string | 词槽名 | 
| +++candidates[].slots[].need_clarify | bool | 词槽是否需要澄清 | 
| +++candidates[].slots[].father_idx | int | 父词槽index,非子词槽,取值-1 | 
| +++candidates[].from_who | string | pow-slu-lev1:由「对话模板」经过「快速生效」或「深度训练」生成的模型识别的 pow-slu-lev2:由「对话模板+对话样本」经过「深度训练」生成的模型识别的 pow-slu-lev3:由「对话模板+对话样本+对话样本自动生成的对话模板」经过「深度训练」生成的模型识别的 inst-slu:由「对话样本」经过「快速生效」或「深度训练」生成的模型识别的 mult-slu:在技能高级设置里开启了「意图槽位一体化训练」,使用「对话模板+对话样本」经过「深度训练」生成的模型识别的 faq-qu:由问答对数据训练出来的模型识别的 | 
| +++candidates[].match_info | string | query匹配信息 | 
| +++candidates[].extra_info | kvdict | 候选项附加信息 | 
| +++qu_res_chosen | string(json) | 最终qu结果,内部格式同result.response.qu_res.candidates[] | 
| +++lexical_analysis | list<object> | query的词法分析结果 | 
| +++lexical_analysis[].term | string | 词汇(含命名实体) | 
| +++lexical_analysis[].weight | float | 重要性权重 | 
| +++lexical_analysis[].type | string | 词性或专名类别 | 
| +++lexical_analysis[].etypes | list<string> | 命名实体兼属的所有专名类别 | 
| +++lexical_analysis[].basic_word | list<string> | 构成词汇的基本词 | 
| +++sentiment_analysis | object | query的情感分析结果 | 
| +++sentiment_analysis.label | string enum | 情感标签,取值范围:"0"、"1"、"2",分别代表:负向情感、无情感、正向情感 | 
| +++sentiment_analysis.pval | float | 置信度,取值范围0-1 | 
响应参数详细说明
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/bot/chat";
        try {
            // 请求参数
            String params = "{\"bot_session\":\"\",\"log_id\":\"7758521\",\"request\":{\"bernard_level\":1,\"client_session\":\"{\\\"client_results\\\":\\\"\\\", \\\"candidate_options\\\":[]}\",\"query\":\"你好\",\"query_info\":{\"asr_candidates\":[],\"source\":\"KEYBOARD\",\"type\":\"TEXT\"},\"updates\":\"\",\"user_id\":\"88888\"},\"bot_id\":\"1057\",\"version\":\"2.0\"}";
            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();
    }
}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/bot/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': '7758521',
    'version': '2.0',
    'request': {
        'user_id': '88888',
        'query_info': {
            'asr_candidates': [],
            'type': 'TEXT',
            'source': 'KEYBOARD'
         },
         'bernard_level': 1,
         'updates': '',
         'query': '你好',
         'client_session': '{"client_results":"", "candidate_options":[]}'
    },
    'bot_session': '',
    'bot_id': '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/bot/chat?access_token=' . $token;
$bodys = '{"bot_session":"","log_id":"7758521","request":{"bernard_level":1,"client_session":"{\"client_results\":\"\", \"candidate_options\":[]}","query":"你好","query_info":{"asr_candidates":[],"source":"KEYBOARD","type":"TEXT"},"updates":"","user_id":"88888"},"bot_id":"1057","version":"2.0"}';
$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/bot/chat?access_token=' + access_token
post_data = "{\"bot_session\":\"\",\"log_id\":\"7758521\",\"request\":{\"bernard_level\":1,\"client_session\":\"{\\\"client_results\\\":\\\"\\\", \\\"candidate_options\\\":[]}\",\"query\":\"你好\",\"query_info\":{\"asr_candidates\":[],\"source\":\"KEYBOARD\",\"type\":\"TEXT\"},\"updates\":\"\",\"user_id\":\"88888\"},\"bot_id\":\"1057\",\"version\":\"2.0\"}"
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/bot/chat?access_token=" + token;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.ContentType = "application/json";
            request.KeepAlive = true;
            string str = "{\"bot_session\":\"\",\"log_id\":\"7758521\",\"request\":{\"bernard_level\":1,\"client_session\":\"{\\\"client_results\\\":\\\"\\\", \\\"candidate_options\\\":[]}\",\"query\":\"你好\",\"query_info\":{\"asr_candidates\":[],\"source\":\"KEYBOARD\",\"type\":\"TEXT\"},\"updates\":\"\",\"user_id\":\"88888\"},\"bot_id\":\"1057\",\"version\":\"2.0\"}"; // 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/bot/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数据(如:{"bot_session":"","log_id":"7758521","request":{"bernard_level":1,"client_session":"{\"client_results\":\"\", \"candidate_options\":[]}","query":"你好","query_info":{"asr_candidates":[],"source":"KEYBOARD","type":"TEXT"},"updates":"","user_id":"88888"},"bot_id":"1057","version":"2.0"}; // 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/bot/chat?access_token={access_token}' --data '{"bot_session":"","log_id":"7758521","request":{"bernard_level":1,"client_session":"{\"client_results\":\"\", \"candidate_options\":[]}","query":"你好","query_info":{"asr_candidates":[],"source":"KEYBOARD","type":"TEXT"},"updates":"","user_id":"88888"},"bot_id":"1057","version":"2.0"}'错误信息
| 错误码 | 类型 | 说明 | 
|---|---|---|
| 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)联系技术支持团队 | 
 
 