Merge pull request #227 from cogwheel0/feat-add-parent-message-id

feat(chat): add parent message ID for proper message linking
This commit is contained in:
cogwheel
2025-12-06 09:34:01 +05:30
committed by GitHub
2 changed files with 29 additions and 2 deletions

View File

@@ -2697,6 +2697,7 @@ class ApiService {
Map<String, dynamic>? backgroundTasks, Map<String, dynamic>? backgroundTasks,
String? responseMessageId, String? responseMessageId,
Map<String, dynamic>? userSettings, Map<String, dynamic>? userSettings,
String? parentMessageId,
}) { }) {
final streamController = StreamController<String>(); final streamController = StreamController<String>();
@@ -2870,6 +2871,11 @@ class ApiService {
if (conversationId != null) { if (conversationId != null) {
data['chat_id'] = conversationId; 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 // Attach background_tasks if provided
if (backgroundTasks != null && backgroundTasks.isNotEmpty) { if (backgroundTasks != null && backgroundTasks.isNotEmpty) {

View File

@@ -1599,6 +1599,15 @@ Future<void> regenerateMessage(
(toolServers != null && toolServers.isNotEmpty); (toolServers != null && toolServers.isNotEmpty);
final bool isBackgroundWebSearchPre = webSearchEnabled; 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) // Dispatch using unified send pipeline (background tools flow)
final bool isBackgroundFlowPre = final bool isBackgroundFlowPre =
isBackgroundToolsFlowPre || isBackgroundToolsFlowPre ||
@@ -1621,6 +1630,7 @@ Future<void> regenerateMessage(
backgroundTasks: bgTasks, backgroundTasks: bgTasks,
responseMessageId: assistantMessageId, responseMessageId: assistantMessageId,
userSettings: userSettingsData, userSettings: userSettingsData,
parentMessageId: lastUserMessageId,
); );
final stream = response.stream; final stream = response.stream;
@@ -2016,8 +2026,9 @@ Future<void> _sendMessageInternal(
// Get selected toggle filter IDs // Get selected toggle filter IDs
final selectedFilterIds = ref.read(selectedFilterIdsProvider); final selectedFilterIds = ref.read(selectedFilterIdsProvider);
final List<String>? filterIdsForApi = final List<String>? filterIdsForApi = selectedFilterIds.isNotEmpty
selectedFilterIds.isNotEmpty ? selectedFilterIds : null; ? selectedFilterIds
: null;
try { try {
// Pre-seed assistant skeleton on server to ensure correct chain // Pre-seed assistant skeleton on server to ensure correct chain
@@ -2230,6 +2241,15 @@ Future<void> _sendMessageInternal(
(toolServers != null && toolServers.isNotEmpty); (toolServers != null && toolServers.isNotEmpty);
final bool isBackgroundWebSearchPre = webSearchEnabled; 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 = final bool shouldBindSession =
wantSessionBinding && wantSessionBinding &&
(isBackgroundToolsFlowPre || (isBackgroundToolsFlowPre ||
@@ -2255,6 +2275,7 @@ Future<void> _sendMessageInternal(
backgroundTasks: bgTasks, backgroundTasks: bgTasks,
responseMessageId: assistantMessageId, responseMessageId: assistantMessageId,
userSettings: userSettingsData, userSettings: userSettingsData,
parentMessageId: lastUserMessageId,
); );
final stream = response.stream; final stream = response.stream;