@tduncan / Cortana / commits / 4c8eb6c

Exclude empty errored assistant turns from chat context

kisloff committed Sep 21, 2026 at 13:29 UTC 4c8eb6caff1110a0919bd00b332eba3bb098dac2
2 files changed +70
lib/features/chat/providers/chat_notifier.dart
+12
@@ -54,6 +54,15 @@ class PendingToolApproval {
54 PendingToolApproval({required this.toolCall, required this.completer});
55 }
56
57 +bool shouldIncludeMessageInChatContext(Message message) {
58 + if (message.role == MessageRole.assistant &&
59 + message.status == MessageStatus.error &&
60 + message.content.trim().isEmpty) {
61 + return false;
62 + }
63 + return true;
64 +}
65 +
66 class ChatState {
67 final List<Message> messages;
68 final List<Message> allMessages;
@@ -1545,6 +1554,9 @@ class ChatNotifier extends Notifier<ChatState> {
1554 }
1555
1556 for (final message in state.messages) {
1557 + if (!shouldIncludeMessageInChatContext(message)) {
1558 + continue;
1559 + }
1560 if (message.role != MessageRole.system || settings.showSystemMessages) {
1561 messages.add(message);
1562 }
test/features/chat/providers/chat_context_filter_test.dart new
+58
@@ -0,0 +1,58 @@
1 +import 'package:flutter_test/flutter_test.dart';
2 +import 'package:localmind/core/models/enums.dart';
3 +import 'package:localmind/features/chat/data/models/message.dart';
4 +import 'package:localmind/features/chat/providers/chat_notifier.dart';
5 +
6 +void main() {
7 + group('shouldIncludeMessageInChatContext', () {
8 + test('drops empty errored assistant placeholders', () {
9 + final message = _message(
10 + role: MessageRole.assistant,
11 + status: MessageStatus.error,
12 + content: '',
13 + );
14 +
15 + expect(shouldIncludeMessageInChatContext(message), isFalse);
16 + });
17 +
18 + test('keeps assistant errors that already have content', () {
19 + final message = _message(
20 + role: MessageRole.assistant,
21 + status: MessageStatus.error,
22 + content: 'Partial response',
23 + );
24 +
25 + expect(shouldIncludeMessageInChatContext(message), isTrue);
26 + });
27 +
28 + test('keeps non-assistant messages and completed assistant messages', () {
29 + expect(
30 + shouldIncludeMessageInChatContext(
31 + _message(role: MessageRole.user, content: 'hello'),
32 + ),
33 + isTrue,
34 + );
35 + expect(
36 + shouldIncludeMessageInChatContext(
37 + _message(role: MessageRole.assistant, content: 'hi'),
38 + ),
39 + isTrue,
40 + );
41 + });
42 + });
43 +}
44 +
45 +Message _message({
46 + required MessageRole role,
47 + MessageStatus status = MessageStatus.complete,
48 + String content = '',
49 +}) {
50 + return Message(
51 + id: 'message-${role.name}-${status.name}-$content',
52 + conversationId: 'conversation-1',
53 + role: role,
54 + content: content,
55 + createdAt: DateTime.utc(2026, 9, 21),
56 + status: status,
57 + );
58 +}