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);
    });
  }
}