开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

技能对话API文档

简介

Hi,您好,欢迎使用百度智能对话定制与服务平台(UNIT)技能对话API服务。

本文档主要针对API开发者,描述百度智能对话定制与服务平台技能对话接口服务的相关内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

  1. 在百度云控制台内提交工单,工单类型请选择人工智能-智能对话定制与服务平台UNIT服务;
  2. 进入UNIT开发者论坛发帖交流;
  3. 当前文档仅用于对话API,网站功能API请移步相关下载查阅《UNIT网站功能API说明文档》。

文档约定

参数结构约定

示例 说明
+ "+"号表示字段层级,首层为第0层级
aaa[].bbb aaa是一个list,bbb是list中的一个元素的属性
enum 枚举值
optional 用于描述应答参数,表明某个参数在应答中不一定存在
  • 所有参数都使用 UTF8 编码
  • 输入、输出中,所有offset、begin、length字段的单位为字符(编码无关)

对话接口描述

基于用户输入的文本内容(语音输入最终也转为文本),返回技能理解与应答的信息。调用本对话API的前提是您已经在unit.baidu.com 已经创建了技能,并定义了技能(新建了对话意图或问答意图)、添加了对话模板/对话样本,且最少完成了一次模型的训练。

请求说明

HTTP方法:POST

请求URL:

注:全国域名包含三地域三运营商的IP接入,不需要自己解决三个地域的流量调度问题。在某个接入点异常或者用户到接入点之间的骨干网异常时,该域名能够自动切换至其他地域的接入点(前提是目标地域有部署生产环境),在最大程度上减少对话调用异常。

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内部行为的超参数
++slu_threshold float 可选 slu阈值,默认值为0.5,值域0.0~1.0,值越高表示召回的阈值越高,避免误召回
++slu_level int 可选 slu运行级别,值域1,2,3,默认值=1
++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,如下图:

如何查找技能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值已经是转义好的数据,不需要开发者再次进行转义。
  • 当前请求中的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群(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)联系技术支持团队