sendMessage method
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 ?? "",
},
),
);
},
);
}