sendMessage method

void sendMessage(
  1. NIMMessage message, {
  2. NIMMessage? replyMsg,
  3. NIMMessagePushConfig? pushConfig,
})

发送消息最终实现 message 消息 replyMsg 回复消息 pushConfig 推送配置 aiAgent 消息发送的AI代理

Implementation

void sendMessage(
  NIMMessage message, {
  NIMMessage? replyMsg,
  NIMMessagePushConfig? pushConfig,
}) async {
  final params = await ChatMessageHelper.getSenderParams(
      message, conversationId,
      pushConfig: pushConfig);
  //设置aiAgent
  // 根据forcePushAccountIds 设置
  NIMAIUser? aiAgent;
  if (pushConfig?.forcePushAccountIds?.isNotEmpty == true ||
      message.pushConfig?.forcePushAccountIds?.isNotEmpty == true) {
    final pushList = pushConfig?.forcePushAccountIds?.isNotEmpty == true
        ? pushConfig?.forcePushAccountIds
        : message.pushConfig?.forcePushAccountIds;
    for (var accId in pushList!) {
      if (AIUserManager.instance.getAIUserById(accId!) != null) {
        aiAgent = AIUserManager.instance.getAIUserById(accId);
        break;
      }
    }
  }
  if (aiAgent == null && isAIUser()) {
    //如果是AI用户,设置aiAgent 为单聊对象
    aiAgent = AIUserManager.instance.getAIUserById(_sessionId!);
  }
  //处理重发的case,从消息的 Config 中获取
  if (aiAgent == null && message.aiConfig?.accountId?.isNotEmpty == true) {
    aiAgent =
        AIUserManager.instance.getAIUserById(message.aiConfig!.accountId!);
  }
  //根据回复消息设置上下文
  List<NIMAIModelCallMessage>? aiMessages;
  if (aiAgent != null && replyMsg != null) {
    final textMsg = ChatMessageHelper.getAIContentMsg(replyMsg);
    if (textMsg != null) {
      aiMessages = [
        NIMAIModelCallMessage(
            type: 0, msg: textMsg, role: NIMAIModelRoleType.user)
      ];
    }
  }
  NIMMessageAIConfigParams? aiConfigParams;
  if (aiAgent != null) {
    final aiStreamMode = await IMKitClient.enableAIStream;
    // AI 参数处理
    aiConfigParams = NIMMessageAIConfigParams(
        accountId: aiAgent.accountId, aiStream: aiStreamMode);
    if (ChatMessageHelper.getAIContentMsg(message)?.isNotEmpty == true) {
      NIMAIModelCallContent content = NIMAIModelCallContent(
          type: 0, msg: ChatMessageHelper.getAIContentMsg(message));
      aiConfigParams.content = content;
    }
  }
  //处理与数字人单聊的上下文
  if (aiConfigParams != null) {
    if (aiMessages?.isNotEmpty == true) {
      aiConfigParams.messages = aiMessages;
    } else if (isAIUser()) {
      //如果没有AI上下文,则取最近的30条消息
      aiConfigParams.messages = getAIMessages();
    }
  }

  params.aiConfig = aiConfigParams;

  //处理重发case
  if (replyMsg == null &&
      message.sendingState == NIMMessageSendingState.failed &&
      message.threadReply?.messageClientId?.isNotEmpty == true) {
    replyMsg = (await NimCore.instance.messageService
            .getMessageListByRefers(messageRefers: [message.threadReply!]))
        .data
        ?.first;
  }

  //发送前的对外回调
  if (ChatKitClient.instance.messageAction != null) {
    ChatKitClient.instance.messageAction!(message, conversationId, params);
  }

  if (replyMsg != null) {
    ChatMessageRepo.replyMessage(
            msg: message, replyMsg: replyMsg, params: params)
        .then((result) {
      _handleMessageSendResult(result);
    });
  } else {
    ChatMessageRepo.sendMessage(
            message: message, conversationId: conversationId, params: params)
        .then((result) {
      _handleMessageSendResult(result);
    });
  }
}