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/10] =?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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] =?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 1c57e68f1367e167038d9eb45e0e334f2d9b0705 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Jun 2025 16:31:07 +0000 Subject: [PATCH 10/10] =?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/express/expression_selector.py | 8 +++---- src/chat/focus_chat/heartFC_chat.py | 5 +---- .../focus_chat/heartflow_message_processor.py | 7 +++--- .../info_processors/relationship_processor.py | 22 +++++-------------- .../info_processors/tool_processor.py | 6 ++--- 5 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/chat/express/expression_selector.py b/src/chat/express/expression_selector.py index 21b0a16b2..ca63db943 100644 --- a/src/chat/express/expression_selector.py +++ b/src/chat/express/expression_selector.py @@ -209,14 +209,14 @@ class ExpressionSelector: return [] all_situations_str = "\n".join(all_situations) - + if target_message: target_message_str = f",现在你想要回复消息:{target_message}" - target_message_extra_block = f"4.考虑你要回复的目标消息" + target_message_extra_block = "4.考虑你要回复的目标消息" else: target_message_str = "" target_message_extra_block = "" - + # 3. 构建prompt(只包含情境,不包含完整的表达方式) prompt = (await global_prompt_manager.get_prompt_async("expression_evaluation_prompt")).format( bot_name=global_config.bot.nickname, @@ -227,7 +227,7 @@ class ExpressionSelector: target_message=target_message_str, target_message_extra_block=target_message_extra_block, ) - + # print(prompt) # 4. 调用LLM diff --git a/src/chat/focus_chat/heartFC_chat.py b/src/chat/focus_chat/heartFC_chat.py index 7704986f8..ba1222650 100644 --- a/src/chat/focus_chat/heartFC_chat.py +++ b/src/chat/focus_chat/heartFC_chat.py @@ -649,7 +649,6 @@ class HeartFChatting: return all_plan_info, processor_time_costs - async def _process_post_planning_processors_with_timing( self, observations: List[Observation], action_type: str, action_data: dict ) -> tuple[dict, dict]: @@ -681,9 +680,7 @@ class HeartFChatting: start_time = time.time() try: result = await asyncio.wait_for( - proc.process_info( - observations=observations, action_type=action_type, action_data=action_data - ), + proc.process_info(observations=observations, action_type=action_type, action_data=action_data), timeout=global_config.focus_chat.processor_max_time, ) end_time = time.time() diff --git a/src/chat/focus_chat/heartflow_message_processor.py b/src/chat/focus_chat/heartflow_message_processor.py index ad5890270..d7299d4c6 100644 --- a/src/chat/focus_chat/heartflow_message_processor.py +++ b/src/chat/focus_chat/heartflow_message_processor.py @@ -181,14 +181,13 @@ class HeartFCMessageReceiver: mes_name = chat.group_info.group_name if chat.group_info else "私聊" # current_time = time.strftime("%H:%M:%S", time.localtime(message.message_info.time)) current_talk_frequency = global_config.chat.get_current_talk_frequency(chat.stream_id) - + # 如果消息中包含图片标识,则日志展示为图片 import re + picid_match = re.search(r"\[picid:([^\]]+)\]", message.processed_plain_text) if picid_match: - logger.info( - f"[{mes_name}]{userinfo.user_nickname}: [图片] [当前回复频率: {current_talk_frequency}]" - ) + logger.info(f"[{mes_name}]{userinfo.user_nickname}: [图片] [当前回复频率: {current_talk_frequency}]") else: logger.info( f"[{mes_name}]{userinfo.user_nickname}:{message.processed_plain_text}[当前回复频率: {current_talk_frequency}]" diff --git a/src/chat/focus_chat/info_processors/relationship_processor.py b/src/chat/focus_chat/info_processors/relationship_processor.py index d4573fcad..e16def9fe 100644 --- a/src/chat/focus_chat/info_processors/relationship_processor.py +++ b/src/chat/focus_chat/info_processors/relationship_processor.py @@ -13,7 +13,6 @@ from typing import List from typing import Dict from src.chat.focus_chat.info.info_base import InfoBase from src.chat.focus_chat.info.relation_info import RelationInfo -from src.person_info.person_info import PersonInfoManager from json_repair import repair_json from src.person_info.person_info import get_person_info_manager import json @@ -26,7 +25,6 @@ from src.chat.utils.chat_message_builder import ( ) import os import pickle -import random # 消息段清理配置 @@ -446,8 +444,8 @@ class PersonImpressionpProcessor(BaseProcessor): List[InfoBase]: 处理后的结构化信息列表 """ await self.build_relation(observations) - - relation_info_str = await self.relation_identify(observations,action_type,action_data) + + relation_info_str = await self.relation_identify(observations, action_type, action_data) if relation_info_str: relation_info = RelationInfo() @@ -462,7 +460,7 @@ class PersonImpressionpProcessor(BaseProcessor): """构建关系""" self._cleanup_old_segments() current_time = time.time() - + if observations: for observation in observations: if isinstance(observation, ChattingObservation): @@ -518,7 +516,7 @@ class PersonImpressionpProcessor(BaseProcessor): # 移除已处理的用户缓存 del self.person_engaged_cache[person_id] self._save_cache() - + async def relation_identify( self, observations: List[Observation] = None, @@ -527,7 +525,7 @@ class PersonImpressionpProcessor(BaseProcessor): ): """ 从人物获取信息 - """ + """ chat_observe_info = "" current_time = time.time() @@ -567,7 +565,6 @@ class PersonImpressionpProcessor(BaseProcessor): self.last_processed_message_time = max(self.last_processed_message_time, msg_time) break - for person_id in list(self.info_fetched_cache.keys()): for info_type in list(self.info_fetched_cache[person_id].keys()): self.info_fetched_cache[person_id][info_type]["ttl"] -= 1 @@ -575,11 +572,7 @@ class PersonImpressionpProcessor(BaseProcessor): del self.info_fetched_cache[person_id][info_type] if not self.info_fetched_cache[person_id]: del self.info_fetched_cache[person_id] - - - - if action_type != "reply": return None @@ -831,7 +824,6 @@ class PersonImpressionpProcessor(BaseProcessor): logger.info(f"{self.log_prefix} 记得 {person_name} 的 {info_type}: {cached_info}") return - try: person_name = await person_info_manager.get_value(person_id, "person_name") person_impression = await person_info_manager.get_value(person_id, "impression") @@ -864,9 +856,7 @@ class PersonImpressionpProcessor(BaseProcessor): return nickname_str = ",".join(global_config.bot.alias_names) - name_block = ( - f"你的名字是{global_config.bot.nickname},你的昵称有{nickname_str},有人也会用这些昵称称呼你。" - ) + name_block = f"你的名字是{global_config.bot.nickname},你的昵称有{nickname_str},有人也会用这些昵称称呼你。" prompt = (await global_prompt_manager.get_prompt_async("fetch_person_info_prompt")).format( name_block=name_block, info_type=info_type, diff --git a/src/chat/focus_chat/info_processors/tool_processor.py b/src/chat/focus_chat/info_processors/tool_processor.py index 51bc4529e..f0034af1d 100644 --- a/src/chat/focus_chat/info_processors/tool_processor.py +++ b/src/chat/focus_chat/info_processors/tool_processor.py @@ -8,7 +8,7 @@ from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.tools.tool_use import ToolUser from src.chat.utils.json_utils import process_llm_tool_calls from .base_processor import BaseProcessor -from typing import List, Optional +from typing import List from src.chat.heart_flow.observation.observation import Observation from src.chat.focus_chat.info.structured_info import StructuredInfo from src.chat.heart_flow.observation.structure_observation import StructureObservation @@ -92,9 +92,7 @@ class ToolProcessor(BaseProcessor): return [structured_info] - async def execute_tools( - self, observation: ChattingObservation, action_type: str = None, action_data: dict = None - ): + async def execute_tools(self, observation: ChattingObservation, action_type: str = None, action_data: dict = None): """ 并行执行工具,返回结构化信息