Coverage for open_webui/utils/channels.py: 23%
13 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 05:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 05:07 +0000
1import re
4def extract_mentions(message: str, triggerChar: str = '@'):
5 # Escape triggerChar in case it's a regex special character
6 triggerChar = re.escape(triggerChar)
7 pattern = rf'<{triggerChar}([A-Z]):([^|>]+)'
9 matches = re.findall(pattern, message)
10 return [{'id_type': id_type, 'id': id_value} for id_type, id_value in matches]
13def replace_mentions(message: str, triggerChar: str = '@', use_label: bool = True):
14 """
15 Replace mentions in the message with either their label (after the pipe `|`)
16 or their id if no label exists.
18 Example:
19 "<@M:gpt-4.1|GPT-4>" -> "GPT-4" (if use_label=True)
20 "<@M:gpt-4.1|GPT-4>" -> "gpt-4.1" (if use_label=False)
21 """
22 # Escape triggerChar
23 triggerChar = re.escape(triggerChar)
25 def replacer(match):
26 id_type, id_value, label = match.groups()
27 return label if use_label and label else id_value
29 # Regex captures: idType, id, optional label
30 pattern = rf'<{triggerChar}([A-Z]):([^|>]+)(?:\|([^>]+))?>'
31 return re.sub(pattern, replacer, message)