智能体状态

通过阅读本文,您可以了解如何从RTC自定义消息通道(DataChannel)中获取智能体状态。

前提条件

解析RTC自定义消息

智能体有聆听中、思考中、讲话中三种状态码。您可以对RTC自定义消息通道中的消息体进行解析,来获取智能体的状态码。系统内置消息字段如下:

字段名称

描述

type

消息类型

senderId

发送消息的UserId

receiverId

接收人的UserId,如果指定消息是群发,则为空字符串

data

具体的消息内容,无内容该字段可以为空

state

智能体状态码

消息体如下:

 {
  "type": 1001,
  "data": {
    "state": 1,             // 1:聆听中  2:思考中  3:讲话中
  }
  "senderId": "robot_1",    // 发送人id
  "receiverId": ""          // 无需指定接收人Id,一般情况下为空
}

IOS

从RTC自定义消息通道中获取智能体状态的示例代码如下:

public func onDataChannelMessage(_ uid: String, controlMsg: AliRtcDataChannelMsg) {
    if controlMsg.type != .custom {
        return
    }

    let dataDict = (try? JSONSerialization.jsonObject(with: controlMsg.data, options: .allowFragments)) as? [String : Any]
    guard let dataDict = dataDict else {
        return
    }
    debugPrint("onDataChannelMessage:\(dataDict)")
    if dataDict["type"] as? Int32 == 1001 {
        let senderId = dataDict["senderId"] as? String
        let receiverId = dataDict["receiverId"] as? String
        let data = dataDict["data"] as? [String: Any]
        if let state = data?["state"] as? Int32 {
            DispatchQueue.main.async {
                // 更新你的UI状态
                debugPrint("Received Robot State Changed: \(state)")
            }
        }
    }
}

Android

从RTC自定义消息通道中获取智能体状态的示例代码如下:

aliRtcEngine.setRtcEngineNotify( new AliRtcEngineNotify() {
    @Override
    public void onDataChannelMessage(String uid, AliRtcEngine.AliRtcDataChannelMsg msg) {
        super.onDataChannelMessage(uid, msg);

        if (msg.type == AliEngineDataMsgCustom) {
            try {
                String dataStr = new String(msg.data);
                JSONObject jsonObject = new JSONObject(dataStr);
                int msgType = jsonObject.optInt("type");
                String senderId = jsonObject.optString("senderId");
                String receiverId = jsonObject.optString("receiverId");
                JSONObject dataJson = jsonObject.optJSONObject("data");
                if (null != dataJson) {

                    if (msgType == 1001) {
                        int robotState = dataJson.optInt("state");
                        ARTCAICallRobotState artcaiCallRobotState = null;
                        if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_LISTENING) {
                            // TODO 机器人聆听状态处理
                        } else if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_THINKING) {
                            // TODO 机器人思考状态处理
                        } else if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_SPEAKING) {
                            // TODO 机器人说话状态处理
                        }
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
});