feat(chat): Improve error handling and message versioning

This commit is contained in:
cogwheel0
2025-12-15 20:55:26 +05:30
parent 45532bf78f
commit 9018e382f7
5 changed files with 257 additions and 32 deletions

View File

@@ -878,13 +878,10 @@ class _AssistantMessageWidgetState extends ConsumerState<AssistantMessageWidget>
),
),
// Display error banner if message has an error
if (widget.message is ChatMessage &&
(widget.message as ChatMessage).error != null) ...[
// Display error banner if message or active version has an error
if (_getActiveError() != null) ...[
const SizedBox(height: Spacing.sm),
_buildErrorBanner(
(widget.message as ChatMessage).error!,
),
_buildErrorBanner(_getActiveError()!),
],
if (hasCodeExecutions) ...[
@@ -933,6 +930,21 @@ class _AssistantMessageWidgetState extends ConsumerState<AssistantMessageWidget>
);
}
/// Get the error for the currently active message or version.
ChatMessageError? _getActiveError() {
if (widget.message is! ChatMessage) return null;
final msg = widget.message as ChatMessage;
// If viewing a version, return the version's error
if (_activeVersionIndex >= 0 &&
_activeVersionIndex < msg.versions.length) {
return msg.versions[_activeVersionIndex].error;
}
// Otherwise return the main message's error
return msg.error;
}
/// Build an error banner matching OpenWebUI's error display style.
/// Shows error content in a red-tinted container with an info icon.
Widget _buildErrorBanner(ChatMessageError error) {
@@ -1303,8 +1315,9 @@ class _AssistantMessageWidgetState extends ConsumerState<AssistantMessageWidget>
final messageId = _messageId;
final hasSpeechText = _ttsPlainText.trim().isNotEmpty;
// Check for error using the error field (preferred) or legacy content detection
final hasErrorField = widget.message is ChatMessage &&
(widget.message as ChatMessage).error != null;
// Also check the active version's error if viewing a version
final activeError = _getActiveError();
final hasErrorField = activeError != null;
final isErrorMessage = hasErrorField ||
widget.message.content.contains('⚠️') ||
widget.message.content.contains('Error') ||