diff --git a/lib/data/services/deapsound_ai_service.dart b/lib/data/services/deapsound_ai_service.dart index da7181f4f..311af1184 100644 --- a/lib/data/services/deapsound_ai_service.dart +++ b/lib/data/services/deapsound_ai_service.dart @@ -78,6 +78,10 @@ class DeapsoundAIService implements AiService { ..body = jsonEncode(requestBody); final response = await client.send(request); + if (response.statusCode != 200) { + throw Exception('Unknown error'); + } + await for (final chunk in response.stream .transform(utf8.decoder) .transform(const LineSplitter())) { diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart index f35c5f275..5657c8b74 100644 --- a/lib/data/services/meeting/summary_task_service.dart +++ b/lib/data/services/meeting/summary_task_service.dart @@ -66,25 +66,62 @@ class SummaryTaskService extends GetxService { _storage.write("summary_task_list", _taskList); } - Future _aiServiceMessage( - int id, String text, String prompt, String outline) async { + void _aiServiceMessage(int id, String text, String prompt, String outline) { final ai = DeapsoundAIService(); - try { - final results = await Future.wait([ - ai.sendMessage(messages: [ - {'role': 'system', 'content': prompt}, - {'role': 'user', 'content': text}, - ]).timeout(const Duration(seconds: 300)), - ai.sendMessage(messages: [ - {'role': 'system', 'content': outline}, - {'role': 'user', 'content': text}, - ]).timeout(const Duration(seconds: 300)), - ], eagerError: true); - _aiServiceValue(id, results[0], results[1]); - } catch (e) { - _isTask = false; - _executeTask(); + String summaryText = ''; + String overviewText = ''; + var summaryDone = false; + var overviewDone = false; + var summarySuccess = false; + var overviewSuccess = false; + + void tryFinish() { + if (summaryDone && overviewDone) { + if (summarySuccess && + overviewSuccess && + summaryText.isNotEmpty && + overviewText.isNotEmpty) { + _aiServiceValue(id, summaryText, overviewText); + } else { + _isTask = false; + _executeTask(); + } + } } + + final summaryStream = ai.sendMessageStream(messages: [ + {'role': 'system', 'content': prompt}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 120)); + + final overviewStream = ai.sendMessageStream(messages: [ + {'role': 'system', 'content': outline}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 120)); + + summaryStream.listen((chunk) { + summaryText += chunk; + }, onError: (error) { + summaryDone = true; + summarySuccess = false; + tryFinish(); + }, onDone: () { + summaryDone = true; + summarySuccess = true; + tryFinish(); + }, cancelOnError: true); + + overviewStream.listen((chunk) { + overviewText += chunk; + }, onError: (error) { + overviewDone = true; + overviewSuccess = false; + tryFinish(); + }, onDone: () { + overviewDone = true; + overviewSuccess = true; + tryFinish(); + }, cancelOnError: true); } Future _aiServiceValue(