sendMessage method

Future<void> sendMessage(
  1. String query,
  2. bool isExternalSearch
)

Implementation

Future<void> sendMessage(String query, bool isExternalSearch) async {
  keyboardFocusNode.unfocus();
  resetLoadingMessage();
  currentWebSearchType.value = null;
  scrollToBottomChat();
  setExternalSearchButton(false);
  messageNotifier = MessageNotifier();
  messageNotifier.setAssistantId(assistant.value?.id ?? "");
  incomingMessages = [];
  inputMessageController.clear();
  inputMessage.value = "";
  kbReferencesBackup = [];
  isStreaming.value = true;

  // Track message start time for metrics
  _currentMessageStartTime = DateTime.now();
  _hasReceivedFirstToken = false;
  List<Attachment> attachments =
      Get.find<AttachmentsController>().getAttachments;
  final PupauMessage senderMessage = PupauMessage(
    id: "",
    attachments: attachments
        .where((Attachment attachment) => !attachment.isShown)
        .toList(),
    query: query,
    answer: "",
    status: MessageStatus.sent,
    createdAt: DateTime.now(),
    assistantId: assistantId,
    assistantType: assistant.value?.type ?? AssistantType.assistant,
  );
  for (Attachment attachment in attachments) {
    attachment.isShown = true;
  }
  addMessage(senderMessage, bypassCheck: true);
  addTaggedAssistants();
  query = MessageService.generateMultiAgentMessage(query, taggedAssistants);
  if (conversation.value == null) await createNewConversation();
  if (conversation.value == null) return;
  bool isFirstSSEData = true;
  listHeight =
      chatScrollController.positions.lastOrNull?.maxScrollExtent ??
      0; //Height of the scrollview, used to animate bottom scroll only if the scrollable height changes
  messageNotifier.setConversationId(conversation.value?.id ?? "");
  PupauEventService.instance.emitPupauEvent(
    PupauEvent(
      type: UpdateConversationType.messageSent,
      payload: {
        "assistantId": assistantId,
        "assistantType": assistant.value?.type ?? AssistantType.assistant,
        "conversationId": conversation.value?.id ?? "",
        "query": query,
      },
    ),
  );
  Stream<SSEModel>? sseStream = await SSEService.createSSEStrean(
    assistantId,
    conversation.value?.id ?? "",
    conversation.value?.token ?? "",
    query,
    isExternalSearch: isExternalSearch,
    isWebSearch: isWebSearchActive.value,
    chatController: this,
  );
  messageSendStream = sseStream?.listen(
    (event) {
      if (event.data != null) {
        Map<String, dynamic> data = jsonDecode(event.data!);
        manageSSEData(data, isExternalSearch);
        if (isFirstSSEData) {
          isFirstSSEData = false;
          autoScrollEnabled = true;
        }
      }
    },
    onError: (e) {
      showErrorSnackbar(
        "${Strings.apiErrorGeneric.tr} ${Strings.apiErrorSendMessage.tr}",
      );
      manageCancelAndErrorMessage();
      PupauEventService.instance.emitPupauEvent(
        PupauEvent(
          type: UpdateConversationType.error,
          payload: {
            "error": "Erorr sending message: ${e.toString()}",
            "assistantId": assistantId,
            "assistantType": assistant.value?.type ?? AssistantType.assistant,
            "conversationId": conversation.value?.id ?? "",
          },
        ),
      );
    },
  );
}