sendAudioMessage method
Future<void>
sendAudioMessage(
- File audioFile, {
- bool isVoiceMode = false,
})
Implementation
Future<void> sendAudioMessage(
File audioFile, {
bool isVoiceMode = false,
}) async {
keyboardFocusNode.unfocus();
resetLoadingMessage();
currentWebSearchType.value = null;
setExternalSearchButton(false);
messageNotifier = MessageNotifier();
messageNotifier.setAssistantId(assistant.value?.id ?? "");
incomingMessages = [];
kbReferencesBackup = [];
isStreaming.value = true;
chatExtraBottomPaddingActive.value = true;
latestQueryAssistantClusterHeight.value = 0.0;
assistantsReplying.value = 1;
update();
setDefaultMessageInputFieldHeight();
final PupauMessage senderMessage = PupauMessage(
id: 'local_${DateTime.now().microsecondsSinceEpoch}',
attachments: const [],
answer: "",
status: MessageStatus.sent,
createdAt: DateTime.now(),
isAudioInput: true,
assistantId: assistantId,
assistantType: assistant.value?.type ?? AssistantType.assistant,
);
_activeStreamingGroupId = _generateStreamingGroupId();
senderMessage.groupId = _activeStreamingGroupId ?? "";
addMessage(senderMessage, bypassCheck: true);
scrollToUserMessage(senderMessage.id);
addTaggedAssistants();
if (conversation.value == null) await createNewConversation();
if (conversation.value == null) return;
bool isFirstSSEData = true;
listHeight =
chatScrollController.positions.lastOrNull?.maxScrollExtent ?? 0;
messageNotifier.setConversationId(conversation.value?.id ?? "");
Stream<SSEModel>? sseStream = await SSEService.createSSEStreamAudio(
assistantId,
conversation.value?.id ?? "",
conversation.value?.token ?? "",
audioFile,
isWebSearch: isWebSearchActive.value,
isVoiceMode: isVoiceMode,
chatController: this,
);
if (sseStream != null) {
_bumpSseIdleTimer();
}
if (sseStream == null) {
showErrorSnackbar(
"${Strings.apiErrorGeneric.tr} ${Strings.apiErrorSendMessage.tr}",
);
_lastFailedAudioFilePath = audioFile.path;
manageCancelAndErrorMessage();
assistantsReplying.value = 0;
return;
}
messageSendStream = sseStream.listen(
(event) {
_bumpSseIdleTimer();
setLastEventId(event);
if (event.data == null || event.data!.trim().isEmpty) return;
try {
final Map<String, dynamic> data = jsonDecode(event.data!);
manageSSEData(data, false);
// Stream accepted; we can clear the retry path.
_lastFailedAudioFilePath = null;
if (isFirstSSEData) {
isFirstSSEData = false;
}
} catch (_) {}
},
onError: (e) {
_cancelSseIdleTimer();
showErrorSnackbar(
"${Strings.apiErrorGeneric.tr} ${Strings.apiErrorSendMessage.tr}",
);
_lastFailedAudioFilePath = audioFile.path;
manageCancelAndErrorMessage();
assistantsReplying.value = 0;
},
onDone: () => _cancelSseIdleTimer(),
);
}