From 20ffe7ba37cc9f8398a42044d20c3c72b94fb49b Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 29 Jul 2024 14:49:12 -0400 Subject: [PATCH] Pass previous X messages to IGC --- .../controllers/choreographer.dart | 33 +++++++++++++++++++ .../controllers/igc_controller.dart | 1 + .../pangea_message_event.dart | 15 +++++++++ lib/pangea/repo/igc_repo.dart | 16 +++++++++ 4 files changed, 65 insertions(+) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 1a11de0e3..eab917f4d 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -9,16 +9,19 @@ import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/enum/assistance_state_enum.dart'; import 'package:fluffychat/pangea/enum/edit_type.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/it_step.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; +import 'package:fluffychat/pangea/repo/igc_repo.dart'; import 'package:fluffychat/pangea/utils/any_state_holder.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/overlay.dart'; import 'package:fluffychat/pangea/widgets/igc/paywall_card.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../../../widgets/matrix.dart'; @@ -66,6 +69,36 @@ class Choreographer { clear(); } + List prevMessages() { + const int howFarBack = 5; + final List events = chatController.timeline?.events ?? []; + final List messages = []; + for (final Event event in events) { + if (event.messageType == MessageTypes.Text || + event.messageType == MessageTypes.Audio) { + final Map? content = + (event.messageType == MessageTypes.Text) + ? event.content + : (event as PangeaMessageEvent) + .getSpeechToTextLocalOnly(l1LangCode, l2LangCode) + ?.toJson(); + if (content != null) { + messages.add( + PreviousMessage( + event.content, + event.senderId, + event.originServerTs, + ), + ); + if (messages.length >= howFarBack) { + return messages; + } + } + } + } + return messages; + } + void send(BuildContext context) { if (isFetching) return; diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index ab0e48669..89941ccec 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -43,6 +43,7 @@ class IgcController { userL2: choreographer.l2LangCode!, enableIGC: choreographer.igcEnabled && !onlyTokensAndLanguageDetection, enableIT: choreographer.itEnabled && !onlyTokensAndLanguageDetection, + prevMessages: choreographer.prevMessages(), ); final IGCTextData igcTextDataResponse = await IgcRepo.getIGC( diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index f1c9e5082..edc4abf0e 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -269,6 +269,21 @@ class PangeaMessageEvent { null; }).toSet(); + SpeechToTextModel? getSpeechToTextLocalOnly( + String? l1Code, + String? l2Code, + ) { + if (l1Code == null || l2Code == null) { + return null; + } + return representations + .firstWhereOrNull( + (element) => element.content.speechToText != null, + ) + ?.content + .speechToText; + } + Future getSpeechToText( String l1Code, String l2Code, diff --git a/lib/pangea/repo/igc_repo.dart b/lib/pangea/repo/igc_repo.dart index e32f6cab7..ce50367cd 100644 --- a/lib/pangea/repo/igc_repo.dart +++ b/lib/pangea/repo/igc_repo.dart @@ -94,12 +94,27 @@ class IgcRepo { } } +/// Previous text/audio messages sent in chat +/// Contain message content, sender, and timestamp +class PreviousMessage { + Map content; + String sender; + DateTime timestamp; + + PreviousMessage( + this.content, + this.sender, + this.timestamp, + ); +} + class IGCRequestBody { String fullText; String userL1; String userL2; bool enableIT; bool enableIGC; + List prevMessages; IGCRequestBody({ required this.fullText, @@ -107,6 +122,7 @@ class IGCRequestBody { required this.userL2, required this.enableIGC, required this.enableIT, + required this.prevMessages, }); Map toJson() => {