From 9152a06f5bb17e62a18bc0c9532f34db1e884d00 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Thu, 30 Oct 2025 18:28:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=E5=A2=9E=E5=BC=BA=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=86=85=E5=AE=B9=E6=B8=85=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BB=A5=E5=A4=84=E7=90=86=E5=B5=8C=E5=A5=97=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 先前的回复头清理逻辑无法有效处理模型生成的复杂或嵌套的回复结构,例如 `[回复:[回复:内容]],说:`,导致清理不彻底。 本次更新通过以下方式提升了清理的健壮性: - 使用循环和更健壮的正则表达式,以递归方式剥离多层嵌套的回复头。 - 增加了一个基于 `],说:` 的 rsplit 作为最终防线,处理日志中观察到的其他特殊格式。 - 移除了可能存在的 `[SPLIT]` 标记,避免意外的消息分割。 此外,本次提交还更新了 QQ 表情列表,增加了新的表情并修正了一个格式错误。 --- src/chat/replyer/default_generator.py | 39 ++++++++++++++----- .../src/recv_handler/qq_emoji_list.py | 2 + .../social_toolkit_plugin/qq_emoji_list.py | 2 +- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index bba8c7fac..572f88ec1 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -1795,17 +1795,36 @@ class DefaultReplyer: ) if content: - # 循环移除,防止模型生成多个回复头 - cleaned_content = content - while True: - new_content = re.sub(r"^\s*\[回复<[^>]+>\s*的消息:[^\]]+\]\s*", "", cleaned_content).lstrip() - if new_content == cleaned_content: - break - cleaned_content = new_content + # 移除 [SPLIT] 标记,防止消息被分割 + cleaned_content = content.replace("[SPLIT]", "") - if cleaned_content != content: - logger.debug(f"移除了模型自行生成的回复头,原始内容: '{content}', 清理后: '{cleaned_content}'") - content = cleaned_content + # 循环移除,以处理模型可能生成的嵌套回复头/尾 + # 使用更健壮的正则表达式,通过非贪婪匹配和向后查找来定位真正的消息内容 + pattern = re.compile(r"^\s*\[回复<.+?>\s*(?:的消息)?:(?P.*)\](?:,?说:)?\s*$", re.DOTALL) + + temp_content = cleaned_content + while True: + match = pattern.match(temp_content) + if match: + new_content = match.group("content").strip() + # 如果内容没有变化,说明可能无法进一步解析,退出循环 + if new_content == temp_content: + break + temp_content = new_content + else: + break # 没有匹配到,退出循环 + + # 在循环处理后,再使用 rsplit 来处理日志中观察到的特殊情况 + # 这可以作为处理复杂嵌套的最后一道防线 + final_split = temp_content.rsplit("],说:", 1) + if len(final_split) > 1: + final_content = final_split[1].strip() + else: + final_content = temp_content + + if final_content != content: + logger.debug(f"清理了模型生成的多余内容,原始内容: '{content}', 清理后: '{final_content}'") + content = final_content logger.debug(f"replyer生成内容: {content}") return content, reasoning_content, model_name, tool_calls diff --git a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/qq_emoji_list.py b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/qq_emoji_list.py index 51c32321a..f47548b0b 100644 --- a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/qq_emoji_list.py +++ b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/qq_emoji_list.py @@ -179,6 +179,8 @@ qq_face: dict = { "393": "[表情:新年中龙]", "394": "[表情:新年大龙]", "395": "[表情:略略略]", + "396": "[表情:龙年快乐]", + "424": "[表情:按钮]", "😊": "[表情:嘿嘿]", "😌": "[表情:羞涩]", "😚": "[ 表情:亲亲]", diff --git a/src/plugins/built_in/social_toolkit_plugin/qq_emoji_list.py b/src/plugins/built_in/social_toolkit_plugin/qq_emoji_list.py index f77aa1b9d..ca0f5bebb 100644 --- a/src/plugins/built_in/social_toolkit_plugin/qq_emoji_list.py +++ b/src/plugins/built_in/social_toolkit_plugin/qq_emoji_list.py @@ -180,5 +180,5 @@ qq_face: dict = { "394": "[表情:新年大龙]", "395": "[表情:略略略]", "396": "[表情:龙年快乐]", - "424": " [表情:按钮]", + "424": "[表情:按钮]", }