From d7c36f3e0ddc56a6f6a7343f90a88e68bf506389 Mon Sep 17 00:00:00 2001 From: cogwheel0 <172976095+cogwheel0@users.noreply.github.com> Date: Sat, 6 Dec 2025 09:33:30 +0530 Subject: [PATCH] feat(chat): add parent message ID for proper message linking --- lib/core/services/api_service.dart | 6 +++++ .../chat/providers/chat_providers.dart | 25 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/core/services/api_service.dart b/lib/core/services/api_service.dart index 54be040..daecffb 100644 --- a/lib/core/services/api_service.dart +++ b/lib/core/services/api_service.dart @@ -2697,6 +2697,7 @@ class ApiService { Map? backgroundTasks, String? responseMessageId, Map? userSettings, + String? parentMessageId, }) { final streamController = StreamController(); @@ -2870,6 +2871,11 @@ class ApiService { if (conversationId != null) { data['chat_id'] = conversationId; } + // Include parent_id for proper message linking (required since OpenWebUI 0.6.41) + // This links the assistant response to the user message it's responding to + if (parentMessageId != null) { + data['parent_id'] = parentMessageId; + } // Attach background_tasks if provided if (backgroundTasks != null && backgroundTasks.isNotEmpty) { diff --git a/lib/features/chat/providers/chat_providers.dart b/lib/features/chat/providers/chat_providers.dart index 7555aed..380e892 100644 --- a/lib/features/chat/providers/chat_providers.dart +++ b/lib/features/chat/providers/chat_providers.dart @@ -1599,6 +1599,15 @@ Future regenerateMessage( (toolServers != null && toolServers.isNotEmpty); final bool isBackgroundWebSearchPre = webSearchEnabled; + // Find the last user message ID for proper parent linking + String? lastUserMessageId; + for (int i = messages.length - 1; i >= 0; i--) { + if (messages[i].role == 'user') { + lastUserMessageId = messages[i].id; + break; + } + } + // Dispatch using unified send pipeline (background tools flow) final bool isBackgroundFlowPre = isBackgroundToolsFlowPre || @@ -1621,6 +1630,7 @@ Future regenerateMessage( backgroundTasks: bgTasks, responseMessageId: assistantMessageId, userSettings: userSettingsData, + parentMessageId: lastUserMessageId, ); final stream = response.stream; @@ -2016,8 +2026,9 @@ Future _sendMessageInternal( // Get selected toggle filter IDs final selectedFilterIds = ref.read(selectedFilterIdsProvider); - final List? filterIdsForApi = - selectedFilterIds.isNotEmpty ? selectedFilterIds : null; + final List? filterIdsForApi = selectedFilterIds.isNotEmpty + ? selectedFilterIds + : null; try { // Pre-seed assistant skeleton on server to ensure correct chain @@ -2230,6 +2241,15 @@ Future _sendMessageInternal( (toolServers != null && toolServers.isNotEmpty); final bool isBackgroundWebSearchPre = webSearchEnabled; + // Find the last user message ID for proper parent linking + String? lastUserMessageId; + for (int i = messages.length - 1; i >= 0; i--) { + if (messages[i].role == 'user') { + lastUserMessageId = messages[i].id; + break; + } + } + final bool shouldBindSession = wantSessionBinding && (isBackgroundToolsFlowPre || @@ -2255,6 +2275,7 @@ Future _sendMessageInternal( backgroundTasks: bgTasks, responseMessageId: assistantMessageId, userSettings: userSettingsData, + parentMessageId: lastUserMessageId, ); final stream = response.stream;