mirror of
https://github.com/open-webui/open-webui.git
synced 2026-07-26 10:41:01 -05:00
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from copy import deepcopy
|
|
|
|
|
|
def build_fork_history(messages_map: dict, source_message_id: str) -> tuple[dict, list[dict]]:
|
|
if not messages_map:
|
|
raise ValueError('chat has no messages to fork')
|
|
|
|
branch: list[tuple[str, dict]] = []
|
|
seen: set[str] = set()
|
|
message_id = source_message_id
|
|
|
|
while message_id:
|
|
if message_id in seen:
|
|
raise ValueError('message branch contains a cycle')
|
|
seen.add(message_id)
|
|
|
|
message = messages_map.get(message_id)
|
|
if not isinstance(message, dict):
|
|
raise ValueError('message not found')
|
|
|
|
branch.append((message_id, message))
|
|
message_id = message.get('parentId')
|
|
|
|
fork_messages: dict[str, dict] = {}
|
|
ordered_messages: list[dict] = []
|
|
parent_id = None
|
|
|
|
for message_id, message in reversed(branch):
|
|
copied = deepcopy(message)
|
|
copied['id'] = message_id
|
|
copied['parentId'] = parent_id
|
|
copied['childrenIds'] = []
|
|
|
|
if parent_id:
|
|
fork_messages[parent_id]['childrenIds'] = [message_id]
|
|
|
|
fork_messages[message_id] = copied
|
|
ordered_messages.append(copied)
|
|
parent_id = message_id
|
|
|
|
return {'messages': fork_messages, 'currentId': source_message_id}, ordered_messages
|