智能对话机器人

智能对话机器人解决方案依托网易IM即时通讯、语音识别、语义理解等服务,为开发者提供人机交互API/SDK、语音识别、意图识别、知识库配置、动态接口等功能,可以在应用IM内快速集成场景丰富的智能对话机器人。

如果开发者通过管理后台关联了网易波特机器人,SDK会在登陆过程中同步机器人列表,开发者和客户可以通过云信消息接口与机器人交互。开发者在初始化SDK后,可以通过以下接口订阅机器人信息变更的广播通知:

C++

void CallbackRobotChanged(NIMResCode rescode, NIMRobotInfoChangeType type, const RobotInfos&)
{
    ...
} 

void foo()
{
    nim::Robot::RegChangedCallback(&CallbackRobotChanged);
}

C#

...

C

static void CallbackRobotInfoChange(int rescode, NIMRobotInfoChangeType type, const char *res, const char *json_extension, const void *callback)
{
    ...
}

typedef void (*nim_robot_reg_changed_callback)(const char *json_extension, nim_robot_change_cb_func cb, const void *user_data);

void foo()
{
    nim_robot_reg_changed_callback func = (nim_robot_reg_changed_callback)GetProcAddress(hInst, "nim_robot_reg_changed_callback");
    func(nullptr, &CallbackRobotInfoChange, nullptr);
}

查询机器人列表

C++

void foo()
{
    auto robot_infos = nim::Robot::QueryAllRobotInfosBlock("");
}

C#

...

C

typedef char* (*nim_robot_query_all_robots_block)(const char *json_extension);
void foo()
{
    nim_robot_query_all_robots_block func = (nim_robot_query_all_robots_block)GetProcAddress(hInst, "nim_robot_query_all_robots_block");
    auto robot_infos = func(nullptr);
}

C++

void foo()
{
    auto robot = nim::Robot::QueryRobotInfoByAccidBlock(robot_accid, "");
}

C#

...

C

typedef char* (*nim_robot_query_robot_by_accid_block)(const char *accid, const char *json_extension);
void foo()
{
    nim_robot_query_robot_by_accid_block func = (nim_robot_query_robot_by_accid_block)GetProcAddress(hInst, "nim_robot_query_robot_by_accid_block");
    auto robot = func(robot_accid);
}        

发消息

机器人消息类型为kNIMMessageTypeRobot,涉及到机器人消息附件内容模板可以参阅机器人消息体模板说明,此外发送机器人消息与发送其他消息没有差别,以C++为例:

void SendRobotMessage(const std::string &content)
{
    nim::IMMessage msg;
    msg.type_                 = nim::kNIMMessageTypeRobot; //定义为机器人消息类型
    msg.content_             = content;                      //消息正文需要赋值
    msg.session_type_        = ; //当前会话类型,P2P Or 群组
    msg.receiver_accid_        = ;    //接收者ID
    msg.client_msg_id_       = ;    //消息id,一般使用guid

    nim::IMBotRobot bot;          //组装机器人类型消息的附件内容
    bot.robot_accid_             = robot_accid; //机器人云信ID
    bot.sent_param_["content"]    = content; 
    bot.sent_param_["type"]     = "01"; //01为文本,具体定义可详见机器人消息体模板说明或波特官网开发文档
    msg.attach_ = bot.ToJsonString();

    std::string json_msg = nim::Talk::CreateBotRobotMessage(msg.receiver_accid_, msg.session_type_, msg.client_msg_id_, content, bot, setting, msg.timetag_);
    nim::Talk::SendMsg(json_msg);
}

收消息

接收机器人消息与接收其他消息没有太多差异,主要注意的是无论是发消息还是收消息,发送方ID都是自己,接收方ID都是发送时填写的接受者ID,这里判断是否是机器人回复的消息可以通过消息附件中的outMsg字段,涉及到机器人消息附件内容模板可以参阅机器人消息体模板说明,以C++为例:

//部分源码来自C++ Demo(bubble_robot.cpp)
void OnReceiveMsgCallback(const nim::IMMessage& message)
{
    if (message.tyoe_ == nim::kNIMMessageTypeRobot)
    {
        nim::IMBotRobot msg_attach;
        nim::Talk::ParseBotRobotMessageAttach(message, msg_attach);
        if (!msg_attach.out_msg_)
        {
            //客户端发给机器人的上行消息
        }
        else
        {
            //机器人回复的下行消息
        }

        if (msg_attach.robot_msg_flag_ == "faq")
        {
            //faq为波特平台定义的机器人消息类型,具体定义可详见机器人消息体模板说明或波特官网开发文档
        }
        else if (msg_attach.robot_msg_flag_ == "bot")
        {
            //bot为波特平台定义的机器人消息类型,具体定义可详见机器人消息体模板说明或波特官网开发文档
        }
    }
}

IM Demo v4.0.0提供了智能对话机器人的初步体验,开发者可以通过源码进一步了解机器人消息的解析过程。