From 282988b0f92860aea2123ff70005814a7cc8587a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E7=9D=BF=E6=AF=85?= Date: Tue, 3 Jun 2025 01:31:08 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E7=BE=A4?= =?UTF-8?q?=E8=81=8A=E4=B8=AD=E6=8F=90=E7=A4=BA=E8=AF=8D=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E5=92=8C=E5=BD=93=E5=89=8D=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8F=91=E9=80=81=E4=BA=BA=E7=9A=84relationship=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/normal_chat/normal_prompt.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/chat/normal_chat/normal_prompt.py b/src/chat/normal_chat/normal_prompt.py index e4d69a0ff..d5f43eb29 100644 --- a/src/chat/normal_chat/normal_prompt.py +++ b/src/chat/normal_chat/normal_prompt.py @@ -104,10 +104,9 @@ class PromptBuilder: (chat_stream.user_info.platform, chat_stream.user_info.user_id) if chat_stream.user_info else None, limit=global_config.normal_chat.max_context_size, ) - elif chat_stream.user_info: - who_chat_in_group.append( - (chat_stream.user_info.platform, chat_stream.user_info.user_id, chat_stream.user_info.user_nickname) - ) + who_chat_in_group.append( + (chat_stream.user_info.platform, chat_stream.user_info.user_id, chat_stream.user_info.user_nickname) + ) relation_prompt = "" for person in who_chat_in_group: From 969147ffb68ac1901d4ade7c431e0cc3198ab6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E6=B2=B3=E6=99=B4?= Date: Thu, 5 Jun 2025 14:50:30 +0900 Subject: [PATCH 02/23] fix too many open files in logger.py --- src/common/logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/logger.py b/src/common/logger.py index 616b44871..614ccdb1d 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -1076,7 +1076,7 @@ def get_module_logger( # 文件处理器 log_dir = Path(current_config["log_dir"]) log_dir.mkdir(parents=True, exist_ok=True) - log_file = log_dir / module_name / "{time:YYYY-MM-DD}.log" + log_file = log_dir / "{time:YYYY-MM-DD}.log" log_file.parent.mkdir(parents=True, exist_ok=True) file_id = logger.add( From 1461155747d15c8e6f884f455b4910c2db71cdc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E6=B2=B3=E6=99=B4?= Date: Thu, 5 Jun 2025 15:44:29 +0900 Subject: [PATCH 03/23] temp fix https://github.com/crate/crate-python/issues/708 --- src/common/tcp_connector.py | 13 +++++++++++++ src/individuality/not_using/offline_llm.py | 3 ++- src/llm_models/utils_model.py | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 src/common/tcp_connector.py diff --git a/src/common/tcp_connector.py b/src/common/tcp_connector.py new file mode 100644 index 000000000..8144feb7d --- /dev/null +++ b/src/common/tcp_connector.py @@ -0,0 +1,13 @@ +import ssl +import certifi +import aiohttp +import asyncio + +ssl_context = ssl.create_default_context(cafile=certifi.where()) +connector = None + +async def get_tcp_connector(): + global connector + if connector is None: + connector = aiohttp.TCPConnector(ssl=ssl_context) + return connector diff --git a/src/individuality/not_using/offline_llm.py b/src/individuality/not_using/offline_llm.py index cc9560011..40ec0889d 100644 --- a/src/individuality/not_using/offline_llm.py +++ b/src/individuality/not_using/offline_llm.py @@ -6,6 +6,7 @@ from typing import Tuple, Union import aiohttp import requests from src.common.logger import get_module_logger +from src.common.tcp_connector import get_tcp_connector from rich.traceback import install install(extra_lines=3) @@ -94,7 +95,7 @@ class LLMRequestOff: max_retries = 3 base_wait_time = 15 - async with aiohttp.ClientSession() as session: + async with aiohttp.ClientSession(connector=await get_tcp_connector()) as session: for retry in range(max_retries): try: async with session.post(api_url, headers=headers, json=data) as response: diff --git a/src/llm_models/utils_model.py b/src/llm_models/utils_model.py index 96212c725..7dc6792f0 100644 --- a/src/llm_models/utils_model.py +++ b/src/llm_models/utils_model.py @@ -6,6 +6,7 @@ from typing import Tuple, Union, Dict, Any import aiohttp from aiohttp.client import ClientResponse from src.common.logger import get_module_logger +from src.common.tcp_connector import get_tcp_connector import base64 from PIL import Image import io @@ -290,7 +291,7 @@ class LLMRequest: # 似乎是openai流式必须要的东西,不过阿里云的qwq-plus加了这个没有影响 if request_content["stream_mode"]: headers["Accept"] = "text/event-stream" - async with aiohttp.ClientSession() as session: + async with aiohttp.ClientSession(connector=await get_tcp_connector()) as session: async with session.post( request_content["api_url"], headers=headers, json=request_content["payload"] ) as response: From 85d543d55584b90683eb007ee8242e487d738710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E6=B2=B3=E6=99=B4?= Date: Thu, 5 Jun 2025 15:49:05 +0900 Subject: [PATCH 04/23] ruff --- src/common/tcp_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/tcp_connector.py b/src/common/tcp_connector.py index 8144feb7d..0eba4997e 100644 --- a/src/common/tcp_connector.py +++ b/src/common/tcp_connector.py @@ -1,11 +1,11 @@ import ssl import certifi import aiohttp -import asyncio ssl_context = ssl.create_default_context(cafile=certifi.where()) connector = None + async def get_tcp_connector(): global connector if connector is None: From feaf49d265c137e8f41b2c8c94f3cbbeac219a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E6=B2=B3=E6=99=B4?= Date: Thu, 5 Jun 2025 17:02:22 +0900 Subject: [PATCH 05/23] fix session closed --- MaiMBot-LPMM | 1 + src/common/tcp_connector.py | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) create mode 160000 MaiMBot-LPMM diff --git a/MaiMBot-LPMM b/MaiMBot-LPMM new file mode 160000 index 000000000..d5824d2f4 --- /dev/null +++ b/MaiMBot-LPMM @@ -0,0 +1 @@ +Subproject commit d5824d2f48c9415cf619d2b32608c2db6a1bbc39 diff --git a/src/common/tcp_connector.py b/src/common/tcp_connector.py index 0eba4997e..dd966e648 100644 --- a/src/common/tcp_connector.py +++ b/src/common/tcp_connector.py @@ -3,11 +3,7 @@ import certifi import aiohttp ssl_context = ssl.create_default_context(cafile=certifi.where()) -connector = None async def get_tcp_connector(): - global connector - if connector is None: - connector = aiohttp.TCPConnector(ssl=ssl_context) - return connector + return aiohttp.TCPConnector(ssl=ssl_context) From dd5672aa03fd39fe57eff38866bb2c313cf3c7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Tue, 10 Jun 2025 09:10:17 +0000 Subject: [PATCH 06/23] delete empty dir --- MaiMBot-LPMM | 1 - 1 file changed, 1 deletion(-) delete mode 160000 MaiMBot-LPMM diff --git a/MaiMBot-LPMM b/MaiMBot-LPMM deleted file mode 160000 index d5824d2f4..000000000 --- a/MaiMBot-LPMM +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5824d2f48c9415cf619d2b32608c2db6a1bbc39 From d36aa552bd23642cc0b0ee309fa2b3d4b05ca289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Tue, 10 Jun 2025 18:16:28 +0900 Subject: [PATCH 07/23] Update ruff.yml --- .github/workflows/ruff.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index ebc7027e1..a45391d32 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -27,13 +27,15 @@ jobs: uses: astral-sh/ruff-action@v3 with: version: "latest" - - run: ruff check --fix - - run: ruff format - - name: Commit changes + - name: Run Ruff Fix + run: ruff check --fix --unsafe-fixes || true + - name: Run Ruff Format + run: ruff format || true + - name: 提交更改 if: success() run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add -A git diff --quiet && git diff --staged --quiet || git commit -m "🤖 自动格式化代码 [skip ci]" - git push \ No newline at end of file + git push From 83c54bd1177d075e58a9bfce5b6d481275a744cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Tue, 10 Jun 2025 18:27:24 +0900 Subject: [PATCH 08/23] Update ruff.yml --- .github/workflows/ruff.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index a45391d32..360f38d44 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -26,6 +26,7 @@ jobs: - name: Install the latest version of ruff uses: astral-sh/ruff-action@v3 with: + args: "--version" version: "latest" - name: Run Ruff Fix run: ruff check --fix --unsafe-fixes || true From 918aa57b012fcf7e9fccaccfdabb8a05ad00e31b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Mon, 16 Jun 2025 10:54:17 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BE=A4=E8=81=8A?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 965c6dca9..c2b9461a1 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,9 @@ ## 💬 讨论 -- [一群](https://qm.qq.com/q/VQ3XZrWgMs) | - [四群](https://qm.qq.com/q/wGePTl1UyY) | - [二群](https://qm.qq.com/q/RzmCiRtHEW) | +- [四群](https://qm.qq.com/q/wGePTl1UyY) | + [一群](https://qm.qq.com/q/VQ3XZrWgMs)(已满) | + [二群](https://qm.qq.com/q/RzmCiRtHEW)(已满) | [五群](https://qm.qq.com/q/JxvHZnxyec)(已满) | [三群](https://qm.qq.com/q/wlH5eT8OmQ)(已满) From 63eb67843344c6b476f5bf25b4443704e14e78c0 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Thu, 26 Jun 2025 23:16:13 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86mmc=E5=AF=B9?= =?UTF-8?q?=E4=BA=8E=E4=B8=8A=E6=8A=A5=E6=B6=88=E6=81=AF=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=86=85message=5Fid=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 目前只能支持text,image,emoji和reply的message_id更新 --- src/chat/message_receive/bot.py | 7 ++ src/chat/message_receive/storage.py | 111 +++++++++++++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index 62f074636..9e46fc7ac 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -131,6 +131,13 @@ class ChatBot: message = MessageRecv(message_data) group_info = message.message_info.group_info user_info = message.message_info.user_info + sent_message = message.message_info.additional_config.get("sent_message", False) + + if user_info.user_id == global_config.bot.qq_account and sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 + await message.process() + await MessageStorage.update_message(message) + return + get_chat_manager().register_message(message) # 创建聊天流 diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index ac7818842..78a72d016 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -1,10 +1,13 @@ import re -from typing import Union +import base64 +import hashlib +from typing import Union, List # from ...common.database.database import db # db is now Peewee's SqliteDatabase instance from .message import MessageSending, MessageRecv from .chat_stream import ChatStream from ...common.database.database_model import Messages, RecalledMessages # Import Peewee models +from ...common.database.database_model import Images from src.common.logger import get_logger logger = get_logger("message_storage") @@ -103,3 +106,109 @@ class MessageStorage: # 如果需要其他存储相关的函数,可以在这里添加 + @staticmethod + async def update_message(message: MessageRecv) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji + """更新最新一条匹配消息的message_id,区分文字和图片情况""" + try: + new_message_id = message.message_info.message_id + user_id = message.message_info.user_info.user_id + + # 检查消息是否包含图片 + image_hashes = MessageStorage._extract_image_hashes(message.message_segment) + + if image_hashes: + # 图片消息处理 + await MessageStorage._update_image_message(message, new_message_id, user_id, image_hashes) + else: + # 文本消息处理 + await MessageStorage._update_text_message(message, new_message_id, user_id) + + except Exception: + logger.exception("更新消息ID失败") + + @staticmethod + def _extract_image_hashes(segment) -> List[str]: + """递归提取消息段中的所有图片哈希值""" + hashes = [] + + if segment.type == "image" or segment.type == "emoji": + try: + # 计算图片哈希值 + binary_data = base64.b64decode(segment.data) + file_hash = hashlib.md5(binary_data).hexdigest() + hashes.append(file_hash) + except Exception as e: + logger.error(f"计算图片哈希失败: {e}") + + elif segment.type == "seglist": + # 递归处理子消息段 + for sub_seg in segment.data: + hashes.extend(MessageStorage._extract_image_hashes(sub_seg)) + + return hashes + + @staticmethod + async def _update_image_message(message: MessageRecv, new_message_id: str, user_id: str, image_hashes: List[str]) -> None: + """处理图片消息的更新逻辑""" + + # 使用第一张图片的哈希值查询描述 + first_image_hash = image_hashes[0] + logger.info(f"{first_image_hash}") + + try: + # 查询图片描述 + image_desc = Images.get_or_none( + Images.emoji_hash == first_image_hash + ) + + if not image_desc or not image_desc.description: + logger.debug(f"未找到图片描述: {first_image_hash}") + return + + # 在Messages表中查找包含该描述的最新消息 + matched_message = Messages.select().where( + (Messages.user_id == user_id) & + (Messages.processed_plain_text.contains(image_desc.description)) + ).order_by(Messages.time.desc()).first() + + if matched_message: + # 更新找到的消息记录 + Messages.update(message_id=new_message_id).where( + Messages.id == matched_message.id + ).execute() + logger.info(f"更新图片消息ID成功: {matched_message.message_id} -> {new_message_id}") + else: + logger.debug(f"未找到包含描述'{image_desc.description}'的消息") + + except Exception as e: + logger.error(f"更新图片消息失败: {e}") + + @staticmethod + async def _update_text_message(message: MessageRecv, new_message_id: str, user_id: str) -> None: + """处理文本消息的更新逻辑""" + try: + # 过滤处理文本(与store_message相同的处理方式) + pattern = r".*?|.*?|.*?" + processed_plain_text = re.sub( + pattern, "", + message.processed_plain_text, + flags=re.DOTALL + ) if message.processed_plain_text else "" + + # 查询最新一条匹配消息 + matched_message = Messages.select().where( + (Messages.user_id == user_id) & + (Messages.processed_plain_text == processed_plain_text) + ).order_by(Messages.time.desc()).first() + + if matched_message: + # 更新找到的消息记录 + Messages.update(message_id=new_message_id).where( + Messages.id == matched_message.id + ).execute() + logger.info(f"更新文本消息ID成功: {matched_message.message_id} -> {new_message_id}") + else: + logger.debug("未找到匹配的文本消息") + + except Exception as e: + logger.error(f"更新文本消息失败: {e}") \ No newline at end of file From 514ccd6be3ac5c4dc46b10132335868ff3d5d5cb Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Thu, 26 Jun 2025 23:30:31 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E4=BD=BFgenerator=E8=83=BD=E5=A4=9F?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=98=AF=E5=90=A6=E5=88=87=E5=8F=A5?= =?UTF-8?q?=E6=88=96=E8=80=85=E7=94=9F=E6=88=90=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 跨越了三份文件的参数传递(( --- src/chat/replyer/default_generator.py | 8 ++++++-- src/chat/utils/utils.py | 6 +++--- src/plugin_system/apis/generator_api.py | 12 ++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index bf247e425..4cc397e89 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -162,6 +162,8 @@ class DefaultReplyer: async def generate_reply_with_context( self, reply_data: Dict[str, Any], + enable_splitter: bool=True, + enable_chinese_typo: bool=True ) -> Tuple[bool, Optional[List[str]]]: """ 回复器 (Replier): 核心逻辑,负责生成回复文本。 @@ -191,7 +193,7 @@ class DefaultReplyer: logger.error(f"{self.log_prefix}LLM 生成失败: {llm_e}") return False, None # LLM 调用失败则无法生成回复 - processed_response = process_llm_response(content) + processed_response = process_llm_response(content,enable_splitter,enable_chinese_typo) # 5. 处理 LLM 响应 if not content: @@ -216,6 +218,8 @@ class DefaultReplyer: async def rewrite_reply_with_context( self, reply_data: Dict[str, Any], + enable_splitter: bool=True, + enable_chinese_typo: bool=True ) -> Tuple[bool, Optional[List[str]]]: """ 表达器 (Expressor): 核心逻辑,负责生成回复文本。 @@ -252,7 +256,7 @@ class DefaultReplyer: logger.error(f"{self.log_prefix}LLM 生成失败: {llm_e}") return False, None # LLM 调用失败则无法生成回复 - processed_response = process_llm_response(content) + processed_response = process_llm_response(content,enable_splitter,enable_chinese_typo) # 5. 处理 LLM 响应 if not content: diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 592964167..56dd9b435 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -321,7 +321,7 @@ def random_remove_punctuation(text: str) -> str: return result -def process_llm_response(text: str) -> list[str]: +def process_llm_response(text: str, enable_splitter: bool=True, enable_chinese_typo: bool=True) -> list[str]: if not global_config.response_post_process.enable_response_post_process: return [text] @@ -359,14 +359,14 @@ def process_llm_response(text: str) -> list[str]: word_replace_rate=global_config.chinese_typo.word_replace_rate, ) - if global_config.response_splitter.enable: + if global_config.response_splitter.enable and enable_splitter: split_sentences = split_into_sentences_w_remove_punctuation(cleaned_text) else: split_sentences = [cleaned_text] sentences = [] for sentence in split_sentences: - if global_config.chinese_typo.enable: + if global_config.chinese_typo.enable and enable_chinese_typo: typoed_text, typo_corrections = typo_generator.create_typo_sentence(sentence) sentences.append(typoed_text) if typo_corrections: diff --git a/src/plugin_system/apis/generator_api.py b/src/plugin_system/apis/generator_api.py index 8130d9b4f..aa3c41253 100644 --- a/src/plugin_system/apis/generator_api.py +++ b/src/plugin_system/apis/generator_api.py @@ -73,6 +73,8 @@ async def generate_reply( chat_stream=None, action_data: Dict[str, Any] = None, chat_id: str = None, + enable_splitter: bool=True, + enable_chinese_typo: bool=True ) -> Tuple[bool, List[Tuple[str, Any]]]: """生成回复 @@ -80,6 +82,8 @@ async def generate_reply( chat_stream: 聊天流对象(优先) action_data: 动作数据 chat_id: 聊天ID(备用) + enable_splitter: 是否启用消息分割器 + enable_chinese_typo: 是否启用错字生成器 Returns: Tuple[bool, List[Tuple[str, Any]]]: (是否成功, 回复集合) @@ -96,6 +100,8 @@ async def generate_reply( # 调用回复器生成回复 success, reply_set = await replyer.generate_reply_with_context( reply_data=action_data or {}, + enable_splitter=enable_splitter, + enable_chinese_typo=enable_chinese_typo ) if success: @@ -114,6 +120,8 @@ async def rewrite_reply( chat_stream=None, reply_data: Dict[str, Any] = None, chat_id: str = None, + enable_splitter: bool=True, + enable_chinese_typo: bool=True ) -> Tuple[bool, List[Tuple[str, Any]]]: """重写回复 @@ -121,6 +129,8 @@ async def rewrite_reply( chat_stream: 聊天流对象(优先) reply_data: 回复数据 chat_id: 聊天ID(备用) + enable_splitter: 是否启用消息分割器 + enable_chinese_typo: 是否启用错字生成器 Returns: Tuple[bool, List[Tuple[str, Any]]]: (是否成功, 回复集合) @@ -137,6 +147,8 @@ async def rewrite_reply( # 调用回复器重写回复 success, reply_set = await replyer.rewrite_reply_with_context( reply_data=reply_data or {}, + enable_splitter=enable_splitter, + enable_chinese_typo=enable_chinese_typo ) if success: From 8e927512e74f3cafcaef929de07942bd570c55f2 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Thu, 26 Jun 2025 23:33:31 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E8=AE=A9base=5Faction=E5=9C=A8=E7=BE=A4?= =?UTF-8?q?=E8=81=8A=E7=8E=AF=E5=A2=83=E4=B8=8B=E4=B9=9F=E8=8E=B7=E5=8F=96?= =?UTF-8?q?user=5Fid=E5=92=8Cuser=5Fnickname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugin_system/base/base_action.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugin_system/base/base_action.py b/src/plugin_system/base/base_action.py index a68091b96..c36af7b07 100644 --- a/src/plugin_system/base/base_action.py +++ b/src/plugin_system/base/base_action.py @@ -108,6 +108,8 @@ class BaseAction(ABC): # print(self.chat_stream.group_info) if self.chat_stream.group_info: self.is_group = True + self.user_id = str(self.chat_stream.user_info.user_id) + self.user_nickname = getattr(self.chat_stream.user_info, "user_nickname", None) self.group_id = str(self.chat_stream.group_info.group_id) self.group_name = getattr(self.chat_stream.group_info, "group_name", None) else: From a3856c87c5767ca5c69e82a9a9cb2efed844ee33 Mon Sep 17 00:00:00 2001 From: Atlas <153055137+atlas4381@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:52:16 +0800 Subject: [PATCH 13/23] =?UTF-8?q?sqlite=E6=95=B0=E6=8D=AE=E5=BA=93webui?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0arm64=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index dab0aaee1..93dde0c76 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -51,7 +51,8 @@ services: networks: - maim_bot sqlite-web: - image: coleifer/sqlite-web + # image: coleifer/sqlite-web + image: wwaaafa/sqlite-web container_name: sqlite-web restart: always ports: From a1b345c749e26c7cdebd27d645df3664c225ca67 Mon Sep 17 00:00:00 2001 From: Atlas <153055137+atlas4381@users.noreply.github.com> Date: Fri, 27 Jun 2025 18:23:00 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E9=83=A8=E7=BD=B2=E6=97=B6=E4=BC=9A=E5=B0=86?= =?UTF-8?q?MaiBot.db=E5=88=9B=E5=BB=BA=E4=B8=BA=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 93dde0c76..2dd5bfa54 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,9 +58,9 @@ services: ports: - "8120:8080" volumes: - - ./data/MaiMBot/MaiBot.db:/data/MaiBot.db + - ./data/MaiBot:/data/MaiBot environment: - - SQLITE_DATABASE=MaiBot.db # 你的数据库文件 + - SQLITE_DATABASE=MaiBot/MaiBot.db # 你的数据库文件 networks: - maim_bot networks: From 5573ec28ff6cd9339d4a830126a4518c87638346 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sat, 28 Jun 2025 17:21:34 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E6=B3=A8=E6=84=8F=E5=88=B0ada=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E5=90=8E=E6=9C=89=E7=9A=84=E4=B8=8D=E7=88=B1=E5=A1=AB?= =?UTF-8?q?addtional=5Fconfig=EF=BC=8C=E7=89=B9=E6=84=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/bot.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index 9e46fc7ac..d4ea40538 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -131,12 +131,12 @@ class ChatBot: message = MessageRecv(message_data) group_info = message.message_info.group_info user_info = message.message_info.user_info - sent_message = message.message_info.additional_config.get("sent_message", False) - - if user_info.user_id == global_config.bot.qq_account and sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 - await message.process() - await MessageStorage.update_message(message) - return + if message.message_info.additional_config: + sent_message = message.message_info.additional_config.get("sent_message", False) + if user_info.user_id == global_config.bot.qq_account and sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 + await message.process() + await MessageStorage.update_message(message) + return get_chat_manager().register_message(message) From 48060c601de18cbcaf3ff4995d140e65fd741ad5 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sat, 28 Jun 2025 20:37:12 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E9=85=8D=E5=90=88ada=E7=9A=84dev?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=EF=BC=8C=E6=9B=B4=E7=AE=80=E6=B4=81=E5=9C=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B6=88=E6=81=AF=E5=9B=9E=E6=8A=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0message=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/bot.py | 8 +-- src/chat/message_receive/storage.py | 99 +++-------------------------- 2 files changed, 12 insertions(+), 95 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index d4ea40538..69eb3aa95 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -132,12 +132,12 @@ class ChatBot: group_info = message.message_info.group_info user_info = message.message_info.user_info if message.message_info.additional_config: - sent_message = message.message_info.additional_config.get("sent_message", False) - if user_info.user_id == global_config.bot.qq_account and sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 + sent_message = message.message_info.additional_config.get("echo", False) + if sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 await message.process() await MessageStorage.update_message(message) return - + get_chat_manager().register_message(message) # 创建聊天流 @@ -204,4 +204,4 @@ class ChatBot: # 创建全局ChatBot实例 -chat_bot = ChatBot() +chat_bot = ChatBot() \ No newline at end of file diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 78a72d016..27995c37f 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -108,107 +108,24 @@ class MessageStorage: # 如果需要其他存储相关的函数,可以在这里添加 @staticmethod async def update_message(message: MessageRecv) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji - """更新最新一条匹配消息的message_id,区分文字和图片情况""" + """更新最新一条匹配消息的message_id""" try: - new_message_id = message.message_info.message_id - user_id = message.message_info.user_info.user_id - - # 检查消息是否包含图片 - image_hashes = MessageStorage._extract_image_hashes(message.message_segment) - - if image_hashes: - # 图片消息处理 - await MessageStorage._update_image_message(message, new_message_id, user_id, image_hashes) - else: - # 文本消息处理 - await MessageStorage._update_text_message(message, new_message_id, user_id) - - except Exception: - logger.exception("更新消息ID失败") - - @staticmethod - def _extract_image_hashes(segment) -> List[str]: - """递归提取消息段中的所有图片哈希值""" - hashes = [] - - if segment.type == "image" or segment.type == "emoji": - try: - # 计算图片哈希值 - binary_data = base64.b64decode(segment.data) - file_hash = hashlib.md5(binary_data).hexdigest() - hashes.append(file_hash) - except Exception as e: - logger.error(f"计算图片哈希失败: {e}") - - elif segment.type == "seglist": - # 递归处理子消息段 - for sub_seg in segment.data: - hashes.extend(MessageStorage._extract_image_hashes(sub_seg)) - - return hashes - - @staticmethod - async def _update_image_message(message: MessageRecv, new_message_id: str, user_id: str, image_hashes: List[str]) -> None: - """处理图片消息的更新逻辑""" - - # 使用第一张图片的哈希值查询描述 - first_image_hash = image_hashes[0] - logger.info(f"{first_image_hash}") - - try: - # 查询图片描述 - image_desc = Images.get_or_none( - Images.emoji_hash == first_image_hash - ) - - if not image_desc or not image_desc.description: - logger.debug(f"未找到图片描述: {first_image_hash}") - return - - # 在Messages表中查找包含该描述的最新消息 - matched_message = Messages.select().where( - (Messages.user_id == user_id) & - (Messages.processed_plain_text.contains(image_desc.description)) - ).order_by(Messages.time.desc()).first() - - if matched_message: - # 更新找到的消息记录 - Messages.update(message_id=new_message_id).where( - Messages.id == matched_message.id - ).execute() - logger.info(f"更新图片消息ID成功: {matched_message.message_id} -> {new_message_id}") - else: - logger.debug(f"未找到包含描述'{image_desc.description}'的消息") - - except Exception as e: - logger.error(f"更新图片消息失败: {e}") - - @staticmethod - async def _update_text_message(message: MessageRecv, new_message_id: str, user_id: str) -> None: - """处理文本消息的更新逻辑""" - try: - # 过滤处理文本(与store_message相同的处理方式) - pattern = r".*?|.*?|.*?" - processed_plain_text = re.sub( - pattern, "", - message.processed_plain_text, - flags=re.DOTALL - ) if message.processed_plain_text else "" + mmc_message_id = message.message_segment.data.get("echo") + qq_message_id = message.message_segment.data.get("actual_id") # 查询最新一条匹配消息 matched_message = Messages.select().where( - (Messages.user_id == user_id) & - (Messages.processed_plain_text == processed_plain_text) + (Messages.message_id == mmc_message_id) ).order_by(Messages.time.desc()).first() if matched_message: # 更新找到的消息记录 - Messages.update(message_id=new_message_id).where( + Messages.update(message_id=qq_message_id).where( Messages.id == matched_message.id ).execute() - logger.info(f"更新文本消息ID成功: {matched_message.message_id} -> {new_message_id}") + logger.info(f"更新消息ID成功: {matched_message.message_id} -> {qq_message_id}") else: - logger.debug("未找到匹配的文本消息") + logger.debug("未找到匹配的消息") except Exception as e: - logger.error(f"更新文本消息失败: {e}") \ No newline at end of file + logger.error(f"更新消息ID失败: {e}") \ No newline at end of file From 08f8aa94df131afe1b0ab01aa6dbc2d52e5eb3a6 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sat, 28 Jun 2025 20:40:33 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/storage.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 27995c37f..185c91483 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -1,13 +1,10 @@ import re -import base64 -import hashlib -from typing import Union, List +from typing import Union # from ...common.database.database import db # db is now Peewee's SqliteDatabase instance from .message import MessageSending, MessageRecv from .chat_stream import ChatStream from ...common.database.database_model import Messages, RecalledMessages # Import Peewee models -from ...common.database.database_model import Images from src.common.logger import get_logger logger = get_logger("message_storage") From 749deb09b8399f85da33ee5255f37652796e55f4 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sun, 29 Jun 2025 00:37:30 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/bot.py | 1 - src/chat/message_receive/storage.py | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index 69eb3aa95..34647c6f8 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -134,7 +134,6 @@ class ChatBot: if message.message_info.additional_config: sent_message = message.message_info.additional_config.get("echo", False) if sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 - await message.process() await MessageStorage.update_message(message) return diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 185c91483..51bb6f17e 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -107,9 +107,15 @@ class MessageStorage: async def update_message(message: MessageRecv) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji """更新最新一条匹配消息的message_id""" try: - mmc_message_id = message.message_segment.data.get("echo") - qq_message_id = message.message_segment.data.get("actual_id") - + if message.message_segment.get("type") == "notify": + mmc_message_id = message.message_segment.data.get("echo") + qq_message_id = message.message_segment.data.get("actual_id") + else: + logger.info(f"更新消息ID错误,seg类型为{message.message_segment.get('type')}") + return + if not qq_message_id: + logger.info("消息不存在message_id,无法更新") + return # 查询最新一条匹配消息 matched_message = Messages.select().where( (Messages.message_id == mmc_message_id) From 757a4c4d394164084d19b53ab432367f274bcfd9 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sun, 29 Jun 2025 01:26:36 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 51bb6f17e..b0a04715b 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -107,7 +107,7 @@ class MessageStorage: async def update_message(message: MessageRecv) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji """更新最新一条匹配消息的message_id""" try: - if message.message_segment.get("type") == "notify": + if message.message_segment.type == "notify": mmc_message_id = message.message_segment.data.get("echo") qq_message_id = message.message_segment.data.get("actual_id") else: From 228caa0f18ea989397392144ab1ac21c9f7c3e21 Mon Sep 17 00:00:00 2001 From: A0000Xz <629995608@qq.com> Date: Sun, 29 Jun 2025 02:05:02 +0800 Subject: [PATCH 20/23] fix --- src/chat/message_receive/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index b0a04715b..9cd357ab2 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -111,7 +111,7 @@ class MessageStorage: mmc_message_id = message.message_segment.data.get("echo") qq_message_id = message.message_segment.data.get("actual_id") else: - logger.info(f"更新消息ID错误,seg类型为{message.message_segment.get('type')}") + logger.info(f"更新消息ID错误,seg类型为{message.message_segment.type}") return if not qq_message_id: logger.info("消息不存在message_id,无法更新") From 9a24bf9162accc518fccd167e54e8454c3ccc6eb Mon Sep 17 00:00:00 2001 From: Atlas <153055137+atlas4381@users.noreply.github.com> Date: Sun, 29 Jun 2025 20:52:25 +0800 Subject: [PATCH 21/23] Update docker-compose.yml --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2dd5bfa54..2b6bc7434 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,9 +58,9 @@ services: ports: - "8120:8080" volumes: - - ./data/MaiBot:/data/MaiBot + - ./data/MaiMBot:/data/MaiMBot environment: - - SQLITE_DATABASE=MaiBot/MaiBot.db # 你的数据库文件 + - SQLITE_DATABASE=MaiMBot/MaiBot.db # 你的数据库文件 networks: - maim_bot networks: From c2185aa91a9a5a145a71b77ec9ef88dc190b97de Mon Sep 17 00:00:00 2001 From: UnCLAS-Prommer Date: Mon, 30 Jun 2025 11:23:16 +0800 Subject: [PATCH 22/23] revert sqlite-web image change --- docker-compose.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2b6bc7434..9bd7172c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -51,8 +51,7 @@ services: networks: - maim_bot sqlite-web: - # image: coleifer/sqlite-web - image: wwaaafa/sqlite-web + image: coleifer/sqlite-web container_name: sqlite-web restart: always ports: From baac5e44cfaf99983457b78fcd3113a8ed8c94ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 30 Jun 2025 09:44:38 +0000 Subject: [PATCH 23/23] =?UTF-8?q?=F0=9F=A4=96=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/bot.py | 6 +++--- src/chat/message_receive/storage.py | 23 +++++++++++------------ src/chat/replyer/default_generator.py | 14 ++++---------- src/chat/utils/utils.py | 2 +- src/plugin_system/apis/generator_api.py | 16 ++++++---------- 5 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index 34647c6f8..8b8d6f255 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -133,10 +133,10 @@ class ChatBot: user_info = message.message_info.user_info if message.message_info.additional_config: sent_message = message.message_info.additional_config.get("echo", False) - if sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 + if sent_message: # 这一段只是为了在一切处理前劫持上报的自身消息,用于更新message_id,需要ada支持上报事件,实际测试中不会对正常使用造成任何问题 await MessageStorage.update_message(message) return - + get_chat_manager().register_message(message) # 创建聊天流 @@ -203,4 +203,4 @@ class ChatBot: # 创建全局ChatBot实例 -chat_bot = ChatBot() \ No newline at end of file +chat_bot = ChatBot() diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 9cd357ab2..c4ef047de 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -101,10 +101,11 @@ class MessageStorage: except Exception: logger.exception("删除撤回消息失败") - -# 如果需要其他存储相关的函数,可以在这里添加 + # 如果需要其他存储相关的函数,可以在这里添加 @staticmethod - async def update_message(message: MessageRecv) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji + async def update_message( + message: MessageRecv, + ) -> None: # 用于实时更新数据库的自身发送消息ID,目前能处理text,reply,image和emoji """更新最新一条匹配消息的message_id""" try: if message.message_segment.type == "notify": @@ -117,18 +118,16 @@ class MessageStorage: logger.info("消息不存在message_id,无法更新") return # 查询最新一条匹配消息 - matched_message = Messages.select().where( - (Messages.message_id == mmc_message_id) - ).order_by(Messages.time.desc()).first() - + matched_message = ( + Messages.select().where((Messages.message_id == mmc_message_id)).order_by(Messages.time.desc()).first() + ) + if matched_message: # 更新找到的消息记录 - Messages.update(message_id=qq_message_id).where( - Messages.id == matched_message.id - ).execute() + Messages.update(message_id=qq_message_id).where(Messages.id == matched_message.id).execute() logger.info(f"更新消息ID成功: {matched_message.message_id} -> {qq_message_id}") else: logger.debug("未找到匹配的消息") - + except Exception as e: - logger.error(f"更新消息ID失败: {e}") \ No newline at end of file + logger.error(f"更新消息ID失败: {e}") diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 4cc397e89..c301ce31c 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -160,10 +160,7 @@ class DefaultReplyer: return None async def generate_reply_with_context( - self, - reply_data: Dict[str, Any], - enable_splitter: bool=True, - enable_chinese_typo: bool=True + self, reply_data: Dict[str, Any], enable_splitter: bool = True, enable_chinese_typo: bool = True ) -> Tuple[bool, Optional[List[str]]]: """ 回复器 (Replier): 核心逻辑,负责生成回复文本。 @@ -193,7 +190,7 @@ class DefaultReplyer: logger.error(f"{self.log_prefix}LLM 生成失败: {llm_e}") return False, None # LLM 调用失败则无法生成回复 - processed_response = process_llm_response(content,enable_splitter,enable_chinese_typo) + processed_response = process_llm_response(content, enable_splitter, enable_chinese_typo) # 5. 处理 LLM 响应 if not content: @@ -216,10 +213,7 @@ class DefaultReplyer: return False, None async def rewrite_reply_with_context( - self, - reply_data: Dict[str, Any], - enable_splitter: bool=True, - enable_chinese_typo: bool=True + self, reply_data: Dict[str, Any], enable_splitter: bool = True, enable_chinese_typo: bool = True ) -> Tuple[bool, Optional[List[str]]]: """ 表达器 (Expressor): 核心逻辑,负责生成回复文本。 @@ -256,7 +250,7 @@ class DefaultReplyer: logger.error(f"{self.log_prefix}LLM 生成失败: {llm_e}") return False, None # LLM 调用失败则无法生成回复 - processed_response = process_llm_response(content,enable_splitter,enable_chinese_typo) + processed_response = process_llm_response(content, enable_splitter, enable_chinese_typo) # 5. 处理 LLM 响应 if not content: diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 56dd9b435..a147846ca 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -321,7 +321,7 @@ def random_remove_punctuation(text: str) -> str: return result -def process_llm_response(text: str, enable_splitter: bool=True, enable_chinese_typo: bool=True) -> list[str]: +def process_llm_response(text: str, enable_splitter: bool = True, enable_chinese_typo: bool = True) -> list[str]: if not global_config.response_post_process.enable_response_post_process: return [text] diff --git a/src/plugin_system/apis/generator_api.py b/src/plugin_system/apis/generator_api.py index aa3c41253..c537d9d95 100644 --- a/src/plugin_system/apis/generator_api.py +++ b/src/plugin_system/apis/generator_api.py @@ -73,8 +73,8 @@ async def generate_reply( chat_stream=None, action_data: Dict[str, Any] = None, chat_id: str = None, - enable_splitter: bool=True, - enable_chinese_typo: bool=True + enable_splitter: bool = True, + enable_chinese_typo: bool = True, ) -> Tuple[bool, List[Tuple[str, Any]]]: """生成回复 @@ -99,9 +99,7 @@ async def generate_reply( # 调用回复器生成回复 success, reply_set = await replyer.generate_reply_with_context( - reply_data=action_data or {}, - enable_splitter=enable_splitter, - enable_chinese_typo=enable_chinese_typo + reply_data=action_data or {}, enable_splitter=enable_splitter, enable_chinese_typo=enable_chinese_typo ) if success: @@ -120,8 +118,8 @@ async def rewrite_reply( chat_stream=None, reply_data: Dict[str, Any] = None, chat_id: str = None, - enable_splitter: bool=True, - enable_chinese_typo: bool=True + enable_splitter: bool = True, + enable_chinese_typo: bool = True, ) -> Tuple[bool, List[Tuple[str, Any]]]: """重写回复 @@ -146,9 +144,7 @@ async def rewrite_reply( # 调用回复器重写回复 success, reply_set = await replyer.rewrite_reply_with_context( - reply_data=reply_data or {}, - enable_splitter=enable_splitter, - enable_chinese_typo=enable_chinese_typo + reply_data=reply_data or {}, enable_splitter=enable_splitter, enable_chinese_typo=enable_chinese_typo ) if success: