---
README.md | 16 ++--
scripts/import_openie.py | 7 +-
src/api/config_api.py | 28 +++----
src/common/logger.py | 6 +-
src/common/message_repository.py | 8 +-
src/config/config.py | 4 +-
src/do_tool/not_used/change_mood.py | 6 +-
src/do_tool/not_used/change_relationship.py | 2 +-
src/do_tool/not_used/get_current_task.py | 9 ++-
src/do_tool/not_used/mid_chat_mem.py | 6 +-
src/do_tool/not_used/send_emoji.py | 2 +-
src/do_tool/tool_can_use/README.md | 2 +-
src/do_tool/tool_can_use/base_tool.py | 12 +--
.../tool_can_use/compare_numbers_tool.py | 7 +-
src/do_tool/tool_can_use/get_knowledge.py | 7 +-
src/do_tool/tool_can_use/get_memory.py | 1 -
src/do_tool/tool_can_use/get_time_date.py | 1 -
.../tool_can_use/lpmm_get_knowledge.py | 1 -
src/do_tool/tool_use.py | 1 -
src/individuality/scene.py | 12 +--
src/plugins/PFC/chat_observer.py | 1 +
src/plugins/PFC/pfc_manager.py | 1 +
src/plugins/PFC/pfc_utils.py | 1 +
src/plugins/PFC/reply_checker.py | 2 +
src/plugins/chat/message.py | 80 ++++++++-----------
src/plugins/chat/message_sender.py | 16 ++--
src/plugins/chat/utils.py | 22 +++--
src/plugins/memory_system/Hippocampus.py | 4 +-
src/plugins/schedule/schedule_generator.py | 3 +-
29 files changed, 125 insertions(+), 143 deletions(-)
diff --git a/README.md b/README.md
index 58cb82c7..f349e0ca 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# 麦麦!MaiCore-MaiMBot (编辑中)
-
+


@@ -12,7 +12,7 @@
-
+
@@ -21,8 +21,8 @@
画师:略nd
-
MaiBot(麦麦)
-
+
MaiBot(麦麦)
+
一款专注于 群组聊天 的赛博网友
探索本项目的文档 »
@@ -50,7 +50,7 @@
- 🧠 **持久记忆系统**:基于MongoDB的长期记忆存储
- 🔄 **动态人格系统**:自适应的性格特征
-
+
@@ -97,9 +97,9 @@
- [四群](https://qm.qq.com/q/wlH5eT8OmQ) 729957033【已满】
-
-
📚 文档
-
+
+## 📚 文档
+
### (部分内容可能过时,请注意版本对应)
diff --git a/scripts/import_openie.py b/scripts/import_openie.py
index 26cbd8ce..595f22ec 100644
--- a/scripts/import_openie.py
+++ b/scripts/import_openie.py
@@ -8,7 +8,6 @@ import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
-from typing import Dict, List
from src.plugins.knowledge.src.lpmmconfig import PG_NAMESPACE, global_config
from src.plugins.knowledge.src.embedding_store import EmbeddingManager
@@ -26,8 +25,8 @@ logger = get_module_logger("LPMM知识库-OpenIE导入")
def hash_deduplicate(
- raw_paragraphs: Dict[str, str],
- triple_list_data: Dict[str, List[List[str]]],
+ raw_paragraphs: dict[str, str],
+ triple_list_data: dict[str, list[list[str]]],
stored_pg_hashes: set,
stored_paragraph_hashes: set,
):
@@ -126,7 +125,7 @@ def main():
)
# 初始化Embedding库
- embed_manager = embed_manager = EmbeddingManager(llm_client_list[global_config["embedding"]["provider"]])
+ embed_manager = EmbeddingManager(llm_client_list[global_config["embedding"]["provider"]])
logger.info("正在从文件加载Embedding库")
try:
embed_manager.load_from_file()
diff --git a/src/api/config_api.py b/src/api/config_api.py
index 025888d8..6ecd4e6d 100644
--- a/src/api/config_api.py
+++ b/src/api/config_api.py
@@ -1,4 +1,4 @@
-from typing import Dict, List, Optional
+from typing import List, Optional
import strawberry
# from packaging.version import Version, InvalidVersion
@@ -128,22 +128,22 @@ class BotConfig:
enable_pfc_chatting: bool # 是否启用PFC聊天
# 模型配置
- llm_reasoning: Dict[str, str] # LLM推理
- # llm_reasoning_minor: Dict[str, str]
- llm_normal: Dict[str, str] # LLM普通
- llm_topic_judge: Dict[str, str] # LLM话题判断
- llm_summary: Dict[str, str] # LLM话题总结
- llm_emotion_judge: Dict[str, str] # LLM情感判断
- embedding: Dict[str, str] # 嵌入
- vlm: Dict[str, str] # VLM
- moderation: Dict[str, str] # 审核
+ llm_reasoning: dict[str, str] # LLM推理
+ # llm_reasoning_minor: dict[str, str]
+ llm_normal: dict[str, str] # LLM普通
+ llm_topic_judge: dict[str, str] # LLM话题判断
+ llm_summary: dict[str, str] # LLM话题总结
+ llm_emotion_judge: dict[str, str] # LLM情感判断
+ embedding: dict[str, str] # 嵌入
+ vlm: dict[str, str] # VLM
+ moderation: dict[str, str] # 审核
# 实验性
- llm_observation: Dict[str, str] # LLM观察
- llm_sub_heartflow: Dict[str, str] # LLM子心流
- llm_heartflow: Dict[str, str] # LLM心流
+ llm_observation: dict[str, str] # LLM观察
+ llm_sub_heartflow: dict[str, str] # LLM子心流
+ llm_heartflow: dict[str, str] # LLM心流
- api_urls: Dict[str, str] # API URLs
+ api_urls: dict[str, str] # API URLs
@strawberry.type
diff --git a/src/common/logger.py b/src/common/logger.py
index a0d621d9..a82c6d88 100644
--- a/src/common/logger.py
+++ b/src/common/logger.py
@@ -1,5 +1,5 @@
from loguru import logger
-from typing import Dict, Optional, Union, List, Tuple
+from typing import Optional, Union, List, Tuple
import sys
import os
from types import ModuleType
@@ -75,8 +75,8 @@ if default_handler_id is not None:
LoguruLogger = logger.__class__
# 全局注册表:记录模块与处理器ID的映射
-_handler_registry: Dict[str, List[int]] = {}
-_custom_style_handlers: Dict[Tuple[str, str], List[int]] = {} # 记录自定义样式处理器ID
+_handler_registry: dict[str, List[int]] = {}
+_custom_style_handlers: dict[Tuple[str, str], List[int]] = {} # 记录自定义样式处理器ID
# 获取日志存储根地址
current_file_path = Path(__file__).resolve()
diff --git a/src/common/message_repository.py b/src/common/message_repository.py
index 72643f91..11bd6095 100644
--- a/src/common/message_repository.py
+++ b/src/common/message_repository.py
@@ -7,11 +7,11 @@ logger = get_module_logger(__name__)
def find_messages(
- message_filter: Dict[str, Any],
+ message_filter: dict[str, Any],
sort: Optional[List[tuple[str, int]]] = None,
limit: int = 0,
limit_mode: str = "latest",
-) -> List[Dict[str, Any]]:
+) -> List[dict[str, Any]]:
"""
根据提供的过滤器、排序和限制条件查找消息。
@@ -26,7 +26,7 @@ def find_messages(
"""
try:
query = db.messages.find(message_filter)
- results: List[Dict[str, Any]] = []
+ results: List[dict[str, Any]] = []
if limit > 0:
if limit_mode == "earliest":
@@ -56,7 +56,7 @@ def find_messages(
return []
-def count_messages(message_filter: Dict[str, Any]) -> int:
+def count_messages(message_filter: dict[str, Any]) -> int:
"""
根据提供的过滤器计算消息数量。
diff --git a/src/config/config.py b/src/config/config.py
index fbf558a3..033d57f5 100644
--- a/src/config/config.py
+++ b/src/config/config.py
@@ -271,8 +271,8 @@ class BotConfig:
enable_pfc_chatting: bool = False # 是否启用PFC聊天
# 模型配置
- llm_reasoning: Dict[str, str] = field(default_factory=lambda: {})
- # llm_reasoning_minor: Dict[str, str] = field(default_factory=lambda: {})
+ llm_reasoning: dict[str, str] = field(default_factory=lambda: {})
+ # llm_reasoning_minor: dict[str, str] = field(default_factory=lambda: {})
llm_normal: Dict[str, str] = field(default_factory=lambda: {})
llm_topic_judge: Dict[str, str] = field(default_factory=lambda: {})
llm_summary: Dict[str, str] = field(default_factory=lambda: {})
diff --git a/src/do_tool/not_used/change_mood.py b/src/do_tool/not_used/change_mood.py
index 430561a2..5dee6ac9 100644
--- a/src/do_tool/not_used/change_mood.py
+++ b/src/do_tool/not_used/change_mood.py
@@ -3,7 +3,7 @@ from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.plugins.moods.moods import MoodManager
-from typing import Dict, Any
+from typing import Any
logger = get_logger("change_mood_tool")
@@ -22,7 +22,7 @@ class ChangeMoodTool(BaseTool):
"required": ["text", "response_set"],
}
- async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict[str, Any]:
"""执行心情改变
Args:
@@ -30,7 +30,7 @@ class ChangeMoodTool(BaseTool):
message_txt: 原始消息文本
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
try:
response_set = function_args.get("response_set")
diff --git a/src/do_tool/not_used/change_relationship.py b/src/do_tool/not_used/change_relationship.py
index 4af32fb8..ab91489f 100644
--- a/src/do_tool/not_used/change_relationship.py
+++ b/src/do_tool/not_used/change_relationship.py
@@ -19,7 +19,7 @@ class RelationshipTool(BaseTool):
"required": ["text", "changed_value", "reason"],
}
- async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> dict:
+ async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict:
"""执行工具功能
Args:
diff --git a/src/do_tool/not_used/get_current_task.py b/src/do_tool/not_used/get_current_task.py
index d5660f6a..30184d67 100644
--- a/src/do_tool/not_used/get_current_task.py
+++ b/src/do_tool/not_used/get_current_task.py
@@ -1,7 +1,7 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.plugins.schedule.schedule_generator import bot_schedule
from src.common.logger import get_module_logger
-from typing import Dict, Any
+from typing import Any
from datetime import datetime
logger = get_module_logger("get_current_task_tool")
@@ -21,7 +21,7 @@ class GetCurrentTaskTool(BaseTool):
"required": ["start_time", "end_time"],
}
- async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict[str, Any]:
"""执行获取当前任务或指定时间段的日程信息
Args:
@@ -29,7 +29,7 @@ class GetCurrentTaskTool(BaseTool):
message_txt: 原始消息文本,此工具不使用
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
start_time = function_args.get("start_time")
end_time = function_args.get("end_time")
@@ -55,5 +55,6 @@ class GetCurrentTaskTool(BaseTool):
task_info = "\n".join(task_list)
else:
task_info = f"在 {start_time} 到 {end_time} 之间没有找到日程信息"
-
+ else:
+ task_info = "请提供有效的开始时间和结束时间"
return {"name": "get_current_task", "content": f"日程信息: {task_info}"}
diff --git a/src/do_tool/not_used/mid_chat_mem.py b/src/do_tool/not_used/mid_chat_mem.py
index 71726a57..0340df13 100644
--- a/src/do_tool/not_used/mid_chat_mem.py
+++ b/src/do_tool/not_used/mid_chat_mem.py
@@ -1,6 +1,6 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.common.logger import get_module_logger
-from typing import Dict, Any
+from typing import Any
logger = get_module_logger("get_mid_memory_tool")
@@ -18,7 +18,7 @@ class GetMidMemoryTool(BaseTool):
"required": ["id"],
}
- async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict[str, Any]:
"""执行记忆获取
Args:
@@ -26,7 +26,7 @@ class GetMidMemoryTool(BaseTool):
message_txt: 原始消息文本
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
try:
id = function_args.get("id")
diff --git a/src/do_tool/not_used/send_emoji.py b/src/do_tool/not_used/send_emoji.py
index 3c6c8a3f..9bf2dd48 100644
--- a/src/do_tool/not_used/send_emoji.py
+++ b/src/do_tool/not_used/send_emoji.py
@@ -17,7 +17,7 @@ class SendEmojiTool(BaseTool):
"required": ["text"],
}
- async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict[str, Any]:
text = function_args.get("text", message_txt)
return {
"name": "send_emoji",
diff --git a/src/do_tool/tool_can_use/README.md b/src/do_tool/tool_can_use/README.md
index 15c77188..0b746b4e 100644
--- a/src/do_tool/tool_can_use/README.md
+++ b/src/do_tool/tool_can_use/README.md
@@ -42,7 +42,7 @@ class MyNewTool(BaseTool):
message_txt: 原始消息文本
Returns:
- Dict: 包含执行结果的字典,必须包含name和content字段
+ dict: 包含执行结果的字典,必须包含name和content字段
"""
# 实现工具逻辑
result = f"工具执行结果: {function_args.get('param1')}"
diff --git a/src/do_tool/tool_can_use/base_tool.py b/src/do_tool/tool_can_use/base_tool.py
index 1dd15baf..b01e543e 100644
--- a/src/do_tool/tool_can_use/base_tool.py
+++ b/src/do_tool/tool_can_use/base_tool.py
@@ -22,11 +22,11 @@ class BaseTool:
parameters = None
@classmethod
- def get_tool_definition(cls) -> Dict[str, Any]:
+ def get_tool_definition(cls) -> dict[str, Any]:
"""获取工具定义,用于LLM工具调用
Returns:
- Dict: 工具定义字典
+ dict: 工具定义字典
"""
if not cls.name or not cls.description or not cls.parameters:
raise NotImplementedError(f"工具类 {cls.__name__} 必须定义 name, description 和 parameters 属性")
@@ -36,14 +36,14 @@ class BaseTool:
"function": {"name": cls.name, "description": cls.description, "parameters": cls.parameters},
}
- async def execute(self, function_args: Dict[str, Any]) -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]:
"""执行工具函数
Args:
function_args: 工具调用参数
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
raise NotImplementedError("子类必须实现execute方法")
@@ -88,11 +88,11 @@ def discover_tools():
logger.info(f"工具发现完成,共注册 {len(TOOL_REGISTRY)} 个工具")
-def get_all_tool_definitions() -> List[Dict[str, Any]]:
+def get_all_tool_definitions() -> List[dict[str, Any]]:
"""获取所有已注册工具的定义
Returns:
- List[Dict]: 工具定义列表
+ List[dict]: 工具定义列表
"""
return [tool_class().get_tool_definition() for tool_class in TOOL_REGISTRY.values()]
diff --git a/src/do_tool/tool_can_use/compare_numbers_tool.py b/src/do_tool/tool_can_use/compare_numbers_tool.py
index 1fbd812a..ef037de9 100644
--- a/src/do_tool/tool_can_use/compare_numbers_tool.py
+++ b/src/do_tool/tool_can_use/compare_numbers_tool.py
@@ -1,6 +1,6 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.common.logger import get_module_logger
-from typing import Dict, Any
+from typing import Any
logger = get_module_logger("compare_numbers_tool")
@@ -19,15 +19,14 @@ class CompareNumbersTool(BaseTool):
"required": ["num1", "num2"],
}
- async def execute(self, function_args: Dict[str, Any]) -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]:
"""执行比较两个数的大小
Args:
function_args: 工具参数
- message_txt: 原始消息文本
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
try:
num1 = function_args.get("num1")
diff --git a/src/do_tool/tool_can_use/get_knowledge.py b/src/do_tool/tool_can_use/get_knowledge.py
index bd4ce86b..20a92264 100644
--- a/src/do_tool/tool_can_use/get_knowledge.py
+++ b/src/do_tool/tool_can_use/get_knowledge.py
@@ -2,7 +2,7 @@ from src.do_tool.tool_can_use.base_tool import BaseTool
from src.plugins.chat.utils import get_embedding
from src.common.database import db
from src.common.logger_manager import get_logger
-from typing import Dict, Any, Union
+from typing import Any, Union
logger = get_logger("get_knowledge_tool")
@@ -21,15 +21,14 @@ class SearchKnowledgeTool(BaseTool):
"required": ["query"],
}
- async def execute(self, function_args: Dict[str, Any]) -> Dict[str, Any]:
+ async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]:
"""执行知识库搜索
Args:
function_args: 工具参数
- message_txt: 原始消息文本
Returns:
- Dict: 工具执行结果
+ dict: 工具执行结果
"""
try:
query = function_args.get("query")
diff --git a/src/do_tool/tool_can_use/get_memory.py b/src/do_tool/tool_can_use/get_memory.py
index b38423ed..c1bcc927 100644
--- a/src/do_tool/tool_can_use/get_memory.py
+++ b/src/do_tool/tool_can_use/get_memory.py
@@ -25,7 +25,6 @@ class GetMemoryTool(BaseTool):
Args:
function_args: 工具参数
- message_txt: 原始消息文本
Returns:
Dict: 工具执行结果
diff --git a/src/do_tool/tool_can_use/get_time_date.py b/src/do_tool/tool_can_use/get_time_date.py
index 6104026e..bd3b1a9c 100644
--- a/src/do_tool/tool_can_use/get_time_date.py
+++ b/src/do_tool/tool_can_use/get_time_date.py
@@ -22,7 +22,6 @@ class GetCurrentDateTimeTool(BaseTool):
Args:
function_args: 工具参数(此工具不使用)
- message_txt: 原始消息文本(此工具不使用)
Returns:
Dict: 工具执行结果
diff --git a/src/do_tool/tool_can_use/lpmm_get_knowledge.py b/src/do_tool/tool_can_use/lpmm_get_knowledge.py
index 4dba1bc7..8754e603 100644
--- a/src/do_tool/tool_can_use/lpmm_get_knowledge.py
+++ b/src/do_tool/tool_can_use/lpmm_get_knowledge.py
@@ -29,7 +29,6 @@ class SearchKnowledgeFromLPMMTool(BaseTool):
Args:
function_args: 工具参数
- message_txt: 原始消息文本
Returns:
Dict: 工具执行结果
diff --git a/src/do_tool/tool_use.py b/src/do_tool/tool_use.py
index 88289fe0..b2f59cc8 100644
--- a/src/do_tool/tool_use.py
+++ b/src/do_tool/tool_use.py
@@ -106,7 +106,6 @@ class ToolUser:
Args:
message_txt: 用户消息文本
- sender_name: 发送者名称
chat_stream: 聊天流对象
observation: 观察对象(可选)
diff --git a/src/individuality/scene.py b/src/individuality/scene.py
index 76304dbb..4edd5dc2 100644
--- a/src/individuality/scene.py
+++ b/src/individuality/scene.py
@@ -1,9 +1,9 @@
import json
-from typing import Dict
import os
+from typing import Any
-def load_scenes() -> Dict:
+def load_scenes() -> dict[str, Any]:
"""
从JSON文件加载场景数据
@@ -20,7 +20,7 @@ def load_scenes() -> Dict:
PERSONALITY_SCENES = load_scenes()
-def get_scene_by_factor(factor: str) -> Dict:
+def get_scene_by_factor(factor: str) -> dict | None:
"""
根据人格因子获取对应的情景测试
@@ -28,12 +28,12 @@ def get_scene_by_factor(factor: str) -> Dict:
factor (str): 人格因子名称
Returns:
- Dict: 包含情景描述的字典
+ dict: 包含情景描述的字典
"""
- return PERSONALITY_SCENES.get(factor, None)
+ return PERSONALITY_SCENES.get(factor,None)
-def get_all_scenes() -> Dict:
+def get_all_scenes() -> dict:
"""
获取所有情景测试
diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py
index 2822e111..e99ed800 100644
--- a/src/plugins/PFC/chat_observer.py
+++ b/src/plugins/PFC/chat_observer.py
@@ -23,6 +23,7 @@ class ChatObserver:
Args:
stream_id: 聊天流ID
+ private_name: 私聊名称
Returns:
ChatObserver: 观察器实例
diff --git a/src/plugins/PFC/pfc_manager.py b/src/plugins/PFC/pfc_manager.py
index 621686a9..7837606c 100644
--- a/src/plugins/PFC/pfc_manager.py
+++ b/src/plugins/PFC/pfc_manager.py
@@ -33,6 +33,7 @@ class PFCManager:
Args:
stream_id: 聊天流ID
+ private_name: 私聊名称
Returns:
Optional[Conversation]: 对话实例,创建失败则返回None
diff --git a/src/plugins/PFC/pfc_utils.py b/src/plugins/PFC/pfc_utils.py
index 5e35d47b..2f7bd5e0 100644
--- a/src/plugins/PFC/pfc_utils.py
+++ b/src/plugins/PFC/pfc_utils.py
@@ -18,6 +18,7 @@ def get_items_from_json(
Args:
content: 包含JSON的文本
+ private_name: 私聊名称
*items: 要提取的字段名
default_values: 字段的默认值,格式为 {字段名: 默认值}
required_types: 字段的必需类型,格式为 {字段名: 类型}
diff --git a/src/plugins/PFC/reply_checker.py b/src/plugins/PFC/reply_checker.py
index 18088895..35e9af50 100644
--- a/src/plugins/PFC/reply_checker.py
+++ b/src/plugins/PFC/reply_checker.py
@@ -29,6 +29,8 @@ class ReplyChecker:
Args:
reply: 生成的回复
goal: 对话目标
+ chat_history: 对话历史记录
+ chat_history_text: 对话历史记录文本
retry_count: 当前重试次数
Returns:
diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py
index 525d30c9..2de88561 100644
--- a/src/plugins/chat/message.py
+++ b/src/plugins/chat/message.py
@@ -1,6 +1,7 @@
import time
+from abc import abstractmethod
from dataclasses import dataclass
-from typing import Dict, List, Optional, Union
+from typing import Optional, Any
import urllib3
@@ -58,12 +59,37 @@ class Message(MessageBase):
# 回复消息
self.reply = reply
+ async def _process_message_segments(self, segment: Seg) -> str:
+ """递归处理消息段,转换为文字描述
+
+ Args:
+ segment: 要处理的消息段
+
+ Returns:
+ str: 处理后的文本
+ """
+ if segment.type == "seglist":
+ # 处理消息段列表
+ segments_text = []
+ for seg in segment.data:
+ processed = await self._process_message_segments(seg)
+ if processed:
+ segments_text.append(processed)
+ return " ".join(segments_text)
+ else:
+ # 处理单个消息段
+ return await self._process_single_segment(segment)
+
+ @abstractmethod
+ async def _process_single_segment(self, segment):
+ pass
+
@dataclass
class MessageRecv(Message):
"""接收消息类,用于处理从MessageCQ序列化的消息"""
- def __init__(self, message_dict: Dict):
+ def __init__(self, message_dict: dict[str, Any]):
"""从MessageCQ的字典初始化
Args:
@@ -90,26 +116,7 @@ class MessageRecv(Message):
self.processed_plain_text = await self._process_message_segments(self.message_segment)
self.detailed_plain_text = self._generate_detailed_text()
- async def _process_message_segments(self, segment: Seg) -> str:
- """递归处理消息段,转换为文字描述
- Args:
- segment: 要处理的消息段
-
- Returns:
- str: 处理后的文本
- """
- if segment.type == "seglist":
- # 处理消息段列表
- segments_text = []
- for seg in segment.data:
- processed = await self._process_message_segments(seg)
- if processed:
- segments_text.append(processed)
- return " ".join(segments_text)
- else:
- # 处理单个消息段
- return await self._process_single_segment(segment)
async def _process_single_segment(self, seg: Seg) -> str:
"""处理单个消息段
@@ -179,28 +186,7 @@ class MessageProcessBase(Message):
self.thinking_time = round(time.time() - self.thinking_start_time, 2)
return self.thinking_time
- async def _process_message_segments(self, segment: Seg) -> str:
- """递归处理消息段,转换为文字描述
-
- Args:
- segment: 要处理的消息段
-
- Returns:
- str: 处理后的文本
- """
- if segment.type == "seglist":
- # 处理消息段列表
- segments_text = []
- for seg in segment.data:
- processed = await self._process_message_segments(seg)
- if processed:
- segments_text.append(processed)
- return " ".join(segments_text)
- else:
- # 处理单个消息段
- return await self._process_single_segment(segment)
-
- async def _process_single_segment(self, seg: Seg) -> Union[str, None]:
+ async def _process_single_segment(self, seg: Seg) -> str | None:
"""处理单个消息段
Args:
@@ -278,7 +264,7 @@ class MessageSending(MessageProcessBase):
message_id: str,
chat_stream: ChatStream,
bot_user_info: UserInfo,
- sender_info: UserInfo, # 用来记录发送者信息,用于私聊回复
+ sender_info: UserInfo | None, # 用来记录发送者信息,用于私聊回复
message_segment: Seg,
reply: Optional["MessageRecv"] = None,
is_head: bool = False,
@@ -303,7 +289,7 @@ class MessageSending(MessageProcessBase):
self.is_emoji = is_emoji
self.apply_set_reply_logic = apply_set_reply_logic
- def set_reply(self, reply: Optional["MessageRecv"] = None) -> None:
+ def set_reply(self, reply: Optional["MessageRecv"] = None):
"""设置回复消息"""
if self.message_info.format_info is not None and "reply" in self.message_info.format_info.accept_format:
if reply:
@@ -317,7 +303,6 @@ class MessageSending(MessageProcessBase):
self.message_segment,
],
)
- return self
async def process(self) -> None:
"""处理消息内容,生成纯文本和详细文本"""
@@ -342,6 +327,7 @@ class MessageSending(MessageProcessBase):
reply=thinking.reply,
is_head=is_head,
is_emoji=is_emoji,
+ sender_info=None,
)
def to_dict(self):
@@ -361,7 +347,7 @@ class MessageSet:
def __init__(self, chat_stream: ChatStream, message_id: str):
self.chat_stream = chat_stream
self.message_id = message_id
- self.messages: List[MessageSending] = []
+ self.messages: list[MessageSending] = []
self.time = round(time.time(), 3) # 保留3位小数
def add_message(self, message: MessageSending) -> None:
diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py
index 30d943d9..ee4865d9 100644
--- a/src/plugins/chat/message_sender.py
+++ b/src/plugins/chat/message_sender.py
@@ -1,7 +1,7 @@
# src/plugins/chat/message_sender.py
import asyncio
import time
-from typing import Dict, List, Optional, Union
+from typing import Union
# from ...common.database import db # 数据库依赖似乎不需要了,注释掉
from ..message.api import global_api
@@ -70,7 +70,7 @@ class MessageContainer:
def __init__(self, chat_id: str, max_size: int = 100):
self.chat_id = chat_id
self.max_size = max_size
- self.messages: List[Union[MessageThinking, MessageSending]] = [] # 明确类型
+ self.messages: list[MessageThinking | MessageSending] = [] # 明确类型
self.last_send_time = 0
self.thinking_wait_timeout = 20 # 思考等待超时时间(秒) - 从旧 sender 合并
@@ -78,7 +78,7 @@ class MessageContainer:
"""计算当前容器中思考消息的数量"""
return sum(1 for msg in self.messages if isinstance(msg, MessageThinking))
- def get_timeout_sending_messages(self) -> List[MessageSending]:
+ def get_timeout_sending_messages(self) -> list[MessageSending]:
"""获取所有超时的MessageSending对象(思考时间超过20秒),按thinking_start_time排序 - 从旧 sender 合并"""
current_time = time.time()
timeout_messages = []
@@ -94,7 +94,7 @@ class MessageContainer:
timeout_messages.sort(key=lambda x: x.thinking_start_time)
return timeout_messages
- def get_earliest_message(self) -> Optional[Union[MessageThinking, MessageSending]]:
+ def get_earliest_message(self):
"""获取thinking_start_time最早的消息对象"""
if not self.messages:
return None
@@ -108,7 +108,7 @@ class MessageContainer:
earliest_message = msg
return earliest_message
- def add_message(self, message: Union[MessageThinking, MessageSending, MessageSet]) -> None:
+ def add_message(self, message: Union[MessageThinking, MessageSending, MessageSet]):
"""添加消息到队列"""
if isinstance(message, MessageSet):
for single_message in message.messages:
@@ -116,7 +116,7 @@ class MessageContainer:
else:
self.messages.append(message)
- def remove_message(self, message_to_remove: Union[MessageThinking, MessageSending]) -> bool:
+ def remove_message(self, message_to_remove: Union[MessageThinking, MessageSending]):
"""移除指定的消息对象,如果消息存在则返回True,否则返回False"""
try:
_initial_len = len(self.messages)
@@ -138,7 +138,7 @@ class MessageContainer:
"""检查是否有待发送的消息"""
return bool(self.messages)
- def get_all_messages(self) -> List[Union[MessageSending, MessageThinking]]:
+ def get_all_messages(self) -> list[MessageThinking | MessageSending]:
"""获取所有消息"""
return list(self.messages) # 返回副本
@@ -148,7 +148,7 @@ class MessageManager:
def __init__(self):
self._processor_task = None
- self.containers: Dict[str, MessageContainer] = {}
+ self.containers: dict[str, MessageContainer] = {}
self.storage = MessageStorage() # 添加 storage 实例
self._running = True # 处理器运行状态
self._container_lock = asyncio.Lock() # 保护 containers 字典的锁
diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py
index 16581f3a..40b4ab7c 100644
--- a/src/plugins/chat/utils.py
+++ b/src/plugins/chat/utils.py
@@ -2,7 +2,6 @@ import random
import time
import re
from collections import Counter
-from typing import Dict, List, Optional
import jieba
import numpy as np
@@ -26,7 +25,7 @@ def is_english_letter(char: str) -> bool:
return "a" <= char.lower() <= "z"
-def db_message_to_str(message_dict: Dict) -> str:
+def db_message_to_str(message_dict: dict) -> str:
logger.debug(f"message_dict: {message_dict}")
time_str = time.strftime("%m-%d %H:%M:%S", time.localtime(message_dict["time"]))
try:
@@ -35,7 +34,7 @@ def db_message_to_str(message_dict: Dict) -> str:
message_dict.get("user_nickname", ""),
message_dict.get("user_cardname", ""),
)
- except Exception:
+ except Exception as e:
name = message_dict.get("user_nickname", "") or f"用户{message_dict['user_id']}"
content = message_dict.get("processed_plain_text", "")
result = f"[{time_str}] {name}: {content}\n"
@@ -77,13 +76,13 @@ def is_mentioned_bot_in_message(message: MessageRecv) -> tuple[bool, float]:
if not is_mentioned:
# 判断是否被回复
if re.match(
- f"\[回复 [\s\S]*?\({str(global_config.BOT_QQ)}\):[\s\S]*?\],说:", message.processed_plain_text
+ f"\[回复 [\s\S]*?\({str(global_config.BOT_QQ)}\):[\s\S]*?],说:" , message.processed_plain_text
):
is_mentioned = True
else:
# 判断内容中是否被提及
message_content = re.sub(r"@[\s\S]*?((\d+))", "", message.processed_plain_text)
- message_content = re.sub(r"\[回复 [\s\S]*?\(((\d+)|未知id)\):[\s\S]*?\],说:", "", message_content)
+ message_content = re.sub(r"\[回复 [\s\S]*?\(((\d+)|未知id)\):[\s\S]*?],说:", "", message_content)
for keyword in keywords:
if keyword in message_content:
is_mentioned = True
@@ -223,7 +222,7 @@ def get_recent_group_speaker(chat_stream_id: int, sender, limit: int = 12) -> li
return who_chat_in_group
-def split_into_sentences_w_remove_punctuation(text: str) -> List[str]:
+def split_into_sentences_w_remove_punctuation(text: str) -> list[str]:
"""将文本分割成句子,并根据概率合并
1. 识别分割点(, , 。 ; 空格),但如果分割点左右都是英文字母则不分割。
2. 将文本分割成 (内容, 分隔符) 的元组。
@@ -370,7 +369,7 @@ def random_remove_punctuation(text: str) -> str:
return result
-def process_llm_response(text: str) -> List[str]:
+def process_llm_response(text: str) -> list[str]:
# 先保护颜文字
if global_config.enable_kaomoji_protection:
protected_text, kaomoji_mapping = protect_kaomoji(text)
@@ -379,7 +378,7 @@ def process_llm_response(text: str) -> List[str]:
protected_text = text
kaomoji_mapping = {}
# 提取被 () 或 [] 包裹且包含中文的内容
- pattern = re.compile(r"[\(\[\(](?=.*[\u4e00-\u9fff]).*?[\)\]\)]")
+ pattern = re.compile(r"[(\[(](?=.*[一-鿿]).*?[)\])]")
# _extracted_contents = pattern.findall(text)
_extracted_contents = pattern.findall(protected_text) # 在保护后的文本上查找
# 去除 () 和 [] 及其包裹的内容
@@ -554,7 +553,7 @@ def protect_kaomoji(sentence):
r"[^()\[\]()【】]*?" # 非括号字符(惰性匹配)
r"[^一-龥a-zA-Z0-9\s]" # 非中文、非英文、非数字、非空格字符(必须包含至少一个)
r"[^()\[\]()【】]*?" # 非括号字符(惰性匹配)
- r"[\)\])】" # 右括号
+ r"[)\])】" # 右括号
r"]"
r")"
r"|"
@@ -704,7 +703,7 @@ def count_messages_between(start_time: float, end_time: float, stream_id: str) -
return 0, 0
-def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal") -> Optional[str]:
+def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal") -> str:
"""将时间戳转换为人类可读的时间格式
Args:
@@ -732,10 +731,9 @@ def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal"
return f"{int(diff / 86400)}天前:\n"
else:
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) + ":\n"
- elif mode == "lite":
+ else: # mode = "lite" or unknown
# 只返回时分秒格式,喵~
return time.strftime("%H:%M:%S", time.localtime(timestamp))
- return None
def parse_text_timestamps(text: str, mode: str = "normal") -> str:
diff --git a/src/plugins/memory_system/Hippocampus.py b/src/plugins/memory_system/Hippocampus.py
index 7a5fc1a8..ff34541e 100644
--- a/src/plugins/memory_system/Hippocampus.py
+++ b/src/plugins/memory_system/Hippocampus.py
@@ -511,7 +511,7 @@ class Hippocampus:
"""从文本中提取关键词并获取相关记忆。
Args:
- topic (str): 记忆主题
+ keywords (list): 输入文本
max_memory_num (int, optional): 返回的记忆条目数量上限。默认为3,表示最多返回3条与输入文本相关度最高的记忆。
max_memory_length (int, optional): 每个主题最多返回的记忆条目数量。默认为2,表示每个主题最多返回2条相似度最高的记忆。
max_depth (int, optional): 记忆检索深度。默认为3。值越大,检索范围越广,可以获取更多间接相关的记忆,但速度会变慢。
@@ -829,7 +829,7 @@ class EntorhinalCortex:
return chat_samples
@staticmethod
- def random_get_msg_snippet(target_timestamp: float, chat_size: int, max_memorized_time_per_msg: int) -> list:
+ def random_get_msg_snippet(target_timestamp: float, chat_size: int, max_memorized_time_per_msg: int) -> list | None:
"""从数据库中随机获取指定时间戳附近的消息片段 (使用 chat_message_builder)"""
try_count = 0
time_window_seconds = random.randint(300, 1800) # 随机时间窗口,5到30分钟
diff --git a/src/plugins/schedule/schedule_generator.py b/src/plugins/schedule/schedule_generator.py
index ee7bdee1..6bd2e587 100644
--- a/src/plugins/schedule/schedule_generator.py
+++ b/src/plugins/schedule/schedule_generator.py
@@ -1,7 +1,6 @@
import datetime
import os
import sys
-from typing import Dict
import asyncio
from dateutil import tz
@@ -162,7 +161,7 @@ class ScheduleGenerator:
async def generate_daily_schedule(
self,
target_date: datetime.datetime = None,
- ) -> Dict[str, str]:
+ ) -> dict[str, str]:
daytime_prompt = self.construct_daytime_prompt(target_date)
daytime_response, _ = await self.llm_scheduler_all.generate_response_async(daytime_prompt)
return daytime_response
From e4959f0386b851f6b40e489672143ed6f053d9cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?=
Date: Thu, 1 May 2025 07:07:13 +0900
Subject: [PATCH 15/18] ruff fix
---
src/common/message_repository.py | 2 +-
src/do_tool/not_used/change_relationship.py | 2 +-
src/do_tool/not_used/send_emoji.py | 2 +-
src/do_tool/tool_can_use/base_tool.py | 2 +-
src/heart_flow/background_tasks.py | 10 +++-----
src/heart_flow/sub_mind.py | 2 +-
src/individuality/scene.py | 2 +-
src/plugins/chat/message.py | 2 --
src/plugins/chat/message_sender.py | 3 +--
src/plugins/chat/utils.py | 6 ++---
src/plugins/heartFC_chat/heartFC_sender.py | 1 -
.../heartFC_chat/heartflow_prompt_builder.py | 4 +---
.../respon_info_catcher/info_catcher.py | 23 ++++++++++++-------
13 files changed, 29 insertions(+), 32 deletions(-)
diff --git a/src/common/message_repository.py b/src/common/message_repository.py
index 11bd6095..9f246077 100644
--- a/src/common/message_repository.py
+++ b/src/common/message_repository.py
@@ -1,7 +1,7 @@
from src.common.database import db
from src.common.logger import get_module_logger
import traceback
-from typing import List, Dict, Any, Optional
+from typing import List, Any, Optional
logger = get_module_logger(__name__)
diff --git a/src/do_tool/not_used/change_relationship.py b/src/do_tool/not_used/change_relationship.py
index ab91489f..96f512e5 100644
--- a/src/do_tool/not_used/change_relationship.py
+++ b/src/do_tool/not_used/change_relationship.py
@@ -1,4 +1,4 @@
-from typing import Dict, Any
+from typing import Any
from src.common.logger_manager import get_logger
from src.do_tool.tool_can_use.base_tool import BaseTool
diff --git a/src/do_tool/not_used/send_emoji.py b/src/do_tool/not_used/send_emoji.py
index 9bf2dd48..d2d00a92 100644
--- a/src/do_tool/not_used/send_emoji.py
+++ b/src/do_tool/not_used/send_emoji.py
@@ -1,7 +1,7 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.common.logger import get_module_logger
-from typing import Dict, Any
+from typing import Any
logger = get_module_logger("send_emoji_tool")
diff --git a/src/do_tool/tool_can_use/base_tool.py b/src/do_tool/tool_can_use/base_tool.py
index b01e543e..42570884 100644
--- a/src/do_tool/tool_can_use/base_tool.py
+++ b/src/do_tool/tool_can_use/base_tool.py
@@ -1,4 +1,4 @@
-from typing import Dict, List, Any, Optional, Type
+from typing import List, Any, Optional, Type
import inspect
import importlib
import pkgutil
diff --git a/src/heart_flow/background_tasks.py b/src/heart_flow/background_tasks.py
index 38360653..1b64c205 100644
--- a/src/heart_flow/background_tasks.py
+++ b/src/heart_flow/background_tasks.py
@@ -26,7 +26,7 @@ LOG_INTERVAL_SECONDS = 3
async def _run_periodic_loop(
- task_name: str, interval: int, task_func: Callable[..., Coroutine[Any, Any, None]], **kwargs
+ task_name: str, interval: int, task_func: Callable[..., Coroutine[Any, Any, None]], **kwargs
):
"""周期性任务主循环"""
while True:
@@ -250,14 +250,10 @@ class BackgroundTaskManager:
# --- Specific Task Runners --- #
async def _run_state_update_cycle(self, interval: int):
- await _run_periodic_loop(
- task_name="State Update", interval=interval, task_func=self._perform_state_update_work
- )
+ await _run_periodic_loop(task_name="State Update", interval=interval, task_func=self._perform_state_update_work)
async def _run_absent_into_chat(self, interval: int):
- await _run_periodic_loop(
- task_name="Into Chat", interval=interval, task_func=self._perform_absent_into_chat
- )
+ await _run_periodic_loop(task_name="Into Chat", interval=interval, task_func=self._perform_absent_into_chat)
async def _run_normal_chat_timeout_check_cycle(self, interval: int):
await _run_periodic_loop(
diff --git a/src/heart_flow/sub_mind.py b/src/heart_flow/sub_mind.py
index 09d7b936..f414e6b2 100644
--- a/src/heart_flow/sub_mind.py
+++ b/src/heart_flow/sub_mind.py
@@ -78,7 +78,7 @@ def calculate_replacement_probability(similarity: float) -> float:
# p = 3.5 * s - 1.4
probability = 3.5 * similarity - 1.4
return max(0.0, probability)
- else: # 0.6 < similarity < 0.9
+ else: # 0.6 < similarity < 0.9
# p = s + 0.1
probability = similarity + 0.1
return min(1.0, max(0.0, probability))
diff --git a/src/individuality/scene.py b/src/individuality/scene.py
index 4edd5dc2..8d7af97f 100644
--- a/src/individuality/scene.py
+++ b/src/individuality/scene.py
@@ -30,7 +30,7 @@ def get_scene_by_factor(factor: str) -> dict | None:
Returns:
dict: 包含情景描述的字典
"""
- return PERSONALITY_SCENES.get(factor,None)
+ return PERSONALITY_SCENES.get(factor, None)
def get_all_scenes() -> dict:
diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py
index 2de88561..e753a999 100644
--- a/src/plugins/chat/message.py
+++ b/src/plugins/chat/message.py
@@ -116,8 +116,6 @@ class MessageRecv(Message):
self.processed_plain_text = await self._process_message_segments(self.message_segment)
self.detailed_plain_text = self._generate_detailed_text()
-
-
async def _process_single_segment(self, seg: Seg) -> str:
"""处理单个消息段
diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py
index ee4865d9..8d134847 100644
--- a/src/plugins/chat/message_sender.py
+++ b/src/plugins/chat/message_sender.py
@@ -4,7 +4,6 @@ import time
from typing import Union
# from ...common.database import db # 数据库依赖似乎不需要了,注释掉
-from ..message.api import global_api
from .message import MessageSending, MessageThinking, MessageSet
from ..storage.storage import MessageStorage
@@ -27,7 +26,7 @@ async def send_via_ws(message: MessageSending) -> None:
async def send_message(
- message: MessageSending,
+ message: MessageSending,
) -> None:
"""发送消息(核心发送逻辑)"""
diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py
index 40b4ab7c..a7408681 100644
--- a/src/plugins/chat/utils.py
+++ b/src/plugins/chat/utils.py
@@ -34,7 +34,7 @@ def db_message_to_str(message_dict: dict) -> str:
message_dict.get("user_nickname", ""),
message_dict.get("user_cardname", ""),
)
- except Exception as e:
+ except Exception:
name = message_dict.get("user_nickname", "") or f"用户{message_dict['user_id']}"
content = message_dict.get("processed_plain_text", "")
result = f"[{time_str}] {name}: {content}\n"
@@ -76,7 +76,7 @@ def is_mentioned_bot_in_message(message: MessageRecv) -> tuple[bool, float]:
if not is_mentioned:
# 判断是否被回复
if re.match(
- f"\[回复 [\s\S]*?\({str(global_config.BOT_QQ)}\):[\s\S]*?],说:" , message.processed_plain_text
+ f"\[回复 [\s\S]*?\({str(global_config.BOT_QQ)}\):[\s\S]*?],说:", message.processed_plain_text
):
is_mentioned = True
else:
@@ -731,7 +731,7 @@ def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal"
return f"{int(diff / 86400)}天前:\n"
else:
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) + ":\n"
- else: # mode = "lite" or unknown
+ else: # mode = "lite" or unknown
# 只返回时分秒格式,喵~
return time.strftime("%H:%M:%S", time.localtime(timestamp))
diff --git a/src/plugins/heartFC_chat/heartFC_sender.py b/src/plugins/heartFC_chat/heartFC_sender.py
index a4103667..fc96207d 100644
--- a/src/plugins/heartFC_chat/heartFC_sender.py
+++ b/src/plugins/heartFC_chat/heartFC_sender.py
@@ -1,7 +1,6 @@
# src/plugins/heartFC_chat/heartFC_sender.py
import asyncio # 重新导入 asyncio
from typing import Dict, Optional # 重新导入类型
-from ..message.api import global_api
from ..chat.message import MessageSending, MessageThinking # 只保留 MessageSending 和 MessageThinking
from ..storage.storage import MessageStorage
from ..chat.utils import truncate_message
diff --git a/src/plugins/heartFC_chat/heartflow_prompt_builder.py b/src/plugins/heartFC_chat/heartflow_prompt_builder.py
index 9b83f265..c6cdf251 100644
--- a/src/plugins/heartFC_chat/heartflow_prompt_builder.py
+++ b/src/plugins/heartFC_chat/heartflow_prompt_builder.py
@@ -151,9 +151,7 @@ JSON 结构如下,包含三个字段 "action", "reasoning", "emoji_query":
Prompt("\n你有以下这些**知识**:\n{prompt_info}\n请你**记住上面的知识**,之后可能会用到。\n", "knowledge_prompt")
-async def _build_prompt_focus(
- reason, current_mind_info, structured_info, chat_stream, sender_name
-) -> tuple[str, str]:
+async def _build_prompt_focus(reason, current_mind_info, structured_info, chat_stream, sender_name) -> tuple[str, str]:
individuality = Individuality.get_instance()
prompt_personality = individuality.get_prompt(x_person=0, level=2)
# 日程构建
diff --git a/src/plugins/respon_info_catcher/info_catcher.py b/src/plugins/respon_info_catcher/info_catcher.py
index 08be4a76..32add842 100644
--- a/src/plugins/respon_info_catcher/info_catcher.py
+++ b/src/plugins/respon_info_catcher/info_catcher.py
@@ -185,18 +185,25 @@ class InfoCatcher:
try:
# 将消息对象转换为可序列化的字典喵~
- thinking_log_data = {"chat_id": self.chat_id, "trigger_text": self.trigger_response_text,
- "response_text": self.response_text, "trigger_info": {
+ thinking_log_data = {
+ "chat_id": self.chat_id,
+ "trigger_text": self.trigger_response_text,
+ "response_text": self.response_text,
+ "trigger_info": {
"time": self.trigger_response_time,
"message": self.message_to_dict(self.trigger_response_message),
- }, "response_info": {
+ },
+ "response_info": {
"time": self.response_time,
"message": self.response_messages,
- }, "timing_results": self.timing_results, "chat_history": self.message_list_to_dict(self.chat_history),
- "chat_history_in_thinking": self.message_list_to_dict(self.chat_history_in_thinking),
- "chat_history_after_response": self.message_list_to_dict(
- self.chat_history_after_response), "heartflow_data": self.heartflow_data,
- "reasoning_data": self.reasoning_data}
+ },
+ "timing_results": self.timing_results,
+ "chat_history": self.message_list_to_dict(self.chat_history),
+ "chat_history_in_thinking": self.message_list_to_dict(self.chat_history_in_thinking),
+ "chat_history_after_response": self.message_list_to_dict(self.chat_history_after_response),
+ "heartflow_data": self.heartflow_data,
+ "reasoning_data": self.reasoning_data,
+ }
# 根据不同的响应模式添加相应的数据喵~ # 现在直接都加上去好了喵~
# if self.response_mode == "heart_flow":
From 45c64208b40c39e969658746aaac734d9d51a483 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?=
Date: Thu, 1 May 2025 07:24:52 +0900
Subject: [PATCH 16/18] refactor: Clean up unused variables and improve code
readability
---
bot.py | 2 --
scripts/info_extraction.py | 2 +-
src/common/message_repository.py | 1 -
src/individuality/individuality.py | 1 -
src/plugins/PFC/action_planner.py | 1 -
src/plugins/PFC/chat_observer.py | 6 +-----
src/plugins/chat/utils.py | 2 +-
src/plugins/emoji_system/emoji_manager.py | 2 --
src/plugins/heartFC_chat/heartFC_chat.py | 9 ++++-----
src/plugins/memory_system/Hippocampus.py | 2 --
src/plugins/person_info/person_info.py | 1 -
src/plugins/willing/mode_dynamic.py | 3 ---
src/plugins/willing/mode_llmcheck.py | 6 ++----
13 files changed, 9 insertions(+), 29 deletions(-)
diff --git a/bot.py b/bot.py
index 770f5365..9a4a5000 100644
--- a/bot.py
+++ b/bot.py
@@ -130,9 +130,7 @@ def check_eula():
privacy_file = Path("PRIVACY.md")
eula_updated = True
- eula_new_hash = None
privacy_updated = True
- privacy_new_hash = None
eula_confirmed = False
privacy_confirmed = False
diff --git a/scripts/info_extraction.py b/scripts/info_extraction.py
index fdb44528..65c4082b 100644
--- a/scripts/info_extraction.py
+++ b/scripts/info_extraction.py
@@ -76,7 +76,7 @@ def process_single_text(pg_hash, raw_data, llm_client_list):
return doc_item, None
-def signal_handler(signum, frame):
+def signal_handler(_signum, _frame):
"""处理Ctrl+C信号"""
logger.info("\n接收到中断信号,正在优雅地关闭程序...")
shutdown_event.set()
diff --git a/src/common/message_repository.py b/src/common/message_repository.py
index 9f246077..03f192ce 100644
--- a/src/common/message_repository.py
+++ b/src/common/message_repository.py
@@ -26,7 +26,6 @@ def find_messages(
"""
try:
query = db.messages.find(message_filter)
- results: List[dict[str, Any]] = []
if limit > 0:
if limit_mode == "earliest":
diff --git a/src/individuality/individuality.py b/src/individuality/individuality.py
index 86e5b63e..9ffdfdaa 100644
--- a/src/individuality/individuality.py
+++ b/src/individuality/individuality.py
@@ -113,7 +113,6 @@ class Individuality:
p_pronoun = "我"
prompt_personality = f"{p_pronoun}{self.personality.personality_core}"
else: # x_person == 0
- p_pronoun = "" # 无人称
# 对于无人称,直接描述核心特征
prompt_personality = f"{self.personality.personality_core}"
diff --git a/src/plugins/PFC/action_planner.py b/src/plugins/PFC/action_planner.py
index 23de9f0d..4770c6ce 100644
--- a/src/plugins/PFC/action_planner.py
+++ b/src/plugins/PFC/action_planner.py
@@ -262,7 +262,6 @@ class ActionPlanner:
# --- 知识信息字符串构建结束 ---
# 获取聊天历史记录 (chat_history_text)
- chat_history_text = ""
try:
if hasattr(observation_info, "chat_history") and observation_info.chat_history:
chat_history_text = observation_info.chat_history_str
diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py
index e99ed800..3576397d 100644
--- a/src/plugins/PFC/chat_observer.py
+++ b/src/plugins/PFC/chat_observer.py
@@ -123,11 +123,7 @@ class ChatObserver:
self.last_cold_chat_check = current_time
# 判断是否冷场
- is_cold = False
- if self.last_message_time is None:
- is_cold = True
- else:
- is_cold = (current_time - self.last_message_time) > self.cold_chat_threshold
+ is_cold = True if self.last_message_time is None else (current_time - self.last_message_time) > self.cold_chat_threshold
# 如果冷场状态发生变化,发送通知
if is_cold != self.is_cold_chat_state:
diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py
index a7408681..cdaa2194 100644
--- a/src/plugins/chat/utils.py
+++ b/src/plugins/chat/utils.py
@@ -156,7 +156,7 @@ async def get_recent_group_messages(chat_id: str, limit: int = 12) -> list:
return message_objects
-def get_recent_group_detailed_plain_text(chat_stream_id: int, limit: int = 12, combine=False):
+def get_recent_group_detailed_plain_text(chat_stream_id: str, limit: int = 12, combine=False):
recent_messages = list(
db.messages.find(
{"chat_id": chat_stream_id},
diff --git a/src/plugins/emoji_system/emoji_manager.py b/src/plugins/emoji_system/emoji_manager.py
index a75a4f90..f789f906 100644
--- a/src/plugins/emoji_system/emoji_manager.py
+++ b/src/plugins/emoji_system/emoji_manager.py
@@ -50,8 +50,6 @@ class MaiEmoji:
async def initialize_hash_format(self):
"""从文件创建表情包实例, 计算哈希值和格式"""
- image_base64 = None
- image_bytes = None
try:
# 使用 full_path 检查文件是否存在
if not os.path.exists(self.full_path):
diff --git a/src/plugins/heartFC_chat/heartFC_chat.py b/src/plugins/heartFC_chat/heartFC_chat.py
index 47d420dd..71b8d81c 100644
--- a/src/plugins/heartFC_chat/heartFC_chat.py
+++ b/src/plugins/heartFC_chat/heartFC_chat.py
@@ -174,7 +174,7 @@ class HeartFChatting:
self,
chat_id: str,
sub_mind: SubMind,
- observations: Observation,
+ observations: list[Observation],
on_consecutive_no_reply_callback: Callable[[], Coroutine[None, None, None]],
):
"""
@@ -631,19 +631,18 @@ class HeartFChatting:
observation = self.observations[0] if self.observations else None
try:
- dang_qian_deng_dai = 0.0 # 初始化本次等待时间
with Timer("等待新消息", cycle_timers):
# 等待新消息、超时或关闭信号,并获取结果
await self._wait_for_new_message(observation, planner_start_db_time, self.log_prefix)
# 从计时器获取实际等待时间
- dang_qian_deng_dai = cycle_timers.get("等待新消息", 0.0)
+ current_waiting = cycle_timers.get("等待新消息", 0.0)
if not self._shutting_down:
self._lian_xu_bu_hui_fu_ci_shu += 1
- self._lian_xu_deng_dai_shi_jian += dang_qian_deng_dai # 累加等待时间
+ self._lian_xu_deng_dai_shi_jian += current_waiting # 累加等待时间
logger.debug(
f"{self.log_prefix} 连续不回复计数增加: {self._lian_xu_bu_hui_fu_ci_shu}/{CONSECUTIVE_NO_REPLY_THRESHOLD}, "
- f"本次等待: {dang_qian_deng_dai:.2f}秒, 累计等待: {self._lian_xu_deng_dai_shi_jian:.2f}秒"
+ f"本次等待: {current_waiting:.2f}秒, 累计等待: {self._lian_xu_deng_dai_shi_jian:.2f}秒"
)
# 检查是否同时达到次数和时间阈值
diff --git a/src/plugins/memory_system/Hippocampus.py b/src/plugins/memory_system/Hippocampus.py
index ff34541e..ccc4d4fa 100644
--- a/src/plugins/memory_system/Hippocampus.py
+++ b/src/plugins/memory_system/Hippocampus.py
@@ -364,7 +364,6 @@ class Hippocampus:
logger.debug(f"有效的关键词: {', '.join(valid_keywords)}")
# 从每个关键词获取记忆
- all_memories = []
activate_map = {} # 存储每个词的累计激活值
# 对每个关键词进行扩散式检索
@@ -536,7 +535,6 @@ class Hippocampus:
logger.debug(f"有效的关键词: {', '.join(valid_keywords)}")
# 从每个关键词获取记忆
- all_memories = []
activate_map = {} # 存储每个词的累计激活值
# 对每个关键词进行扩散式检索
diff --git a/src/plugins/person_info/person_info.py b/src/plugins/person_info/person_info.py
index 8bafe5eb..a71f95f8 100644
--- a/src/plugins/person_info/person_info.py
+++ b/src/plugins/person_info/person_info.py
@@ -137,7 +137,6 @@ class PersonInfoManager:
@staticmethod
def _extract_json_from_text(text: str) -> dict:
"""从文本中提取JSON数据的高容错方法"""
- parsed_json = None
try:
# 尝试直接解析
parsed_json = json.loads(text)
diff --git a/src/plugins/willing/mode_dynamic.py b/src/plugins/willing/mode_dynamic.py
index ab1389ea..029da4e0 100644
--- a/src/plugins/willing/mode_dynamic.py
+++ b/src/plugins/willing/mode_dynamic.py
@@ -50,7 +50,6 @@ class DynamicWillingManager(BaseWillingManager):
is_high_mode = self.chat_high_willing_mode.get(chat_id, False)
# 获取当前模式的持续时间
- duration = 0
if is_high_mode:
duration = self.chat_high_willing_duration.get(chat_id, 180) # 默认3分钟
else:
@@ -154,8 +153,6 @@ class DynamicWillingManager(BaseWillingManager):
)
# 根据当前模式计算回复概率
- base_probability = 0.0
-
if in_conversation_context:
# 在对话上下文中,降低基础回复概率
base_probability = 0.5 if is_high_mode else 0.25
diff --git a/src/plugins/willing/mode_llmcheck.py b/src/plugins/willing/mode_llmcheck.py
index ec1cde29..697621b1 100644
--- a/src/plugins/willing/mode_llmcheck.py
+++ b/src/plugins/willing/mode_llmcheck.py
@@ -76,10 +76,8 @@ class LlmcheckWillingManager(MxpWillingManager):
current_date = time.strftime("%Y-%m-%d", time.localtime())
current_time = time.strftime("%H:%M:%S", time.localtime())
- chat_talking_prompt = ""
- if chat_id:
- chat_talking_prompt = get_recent_group_detailed_plain_text(chat_id, limit=length, combine=True)
- else:
+ chat_talking_prompt = get_recent_group_detailed_plain_text(chat_id, limit=length, combine=True)
+ if not chat_id:
return 0
# if is_mentioned_bot:
From 0fba84c193d8911a48f5a5eaa9d591948d7b290c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
Date: Wed, 30 Apr 2025 22:25:33 +0000
Subject: [PATCH 17/18] =?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/plugins/PFC/chat_observer.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py
index 3576397d..e66824a2 100644
--- a/src/plugins/PFC/chat_observer.py
+++ b/src/plugins/PFC/chat_observer.py
@@ -123,7 +123,11 @@ class ChatObserver:
self.last_cold_chat_check = current_time
# 判断是否冷场
- is_cold = True if self.last_message_time is None else (current_time - self.last_message_time) > self.cold_chat_threshold
+ is_cold = (
+ True
+ if self.last_message_time is None
+ else (current_time - self.last_message_time) > self.cold_chat_threshold
+ )
# 如果冷场状态发生变化,发送通知
if is_cold != self.is_cold_chat_state:
From 1b30598797a51812c455eb549c339769e27ce0cd Mon Sep 17 00:00:00 2001
From: UnCLAS-Prommer
Date: Thu, 1 May 2025 09:59:36 +0800
Subject: [PATCH 18/18] =?UTF-8?q?=E8=AE=A9=E9=BA=A6=E9=BA=A6=E8=87=B3?=
=?UTF-8?q?=E5=B0=91=E8=83=BD=E5=90=AF=E5=8A=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/plugins/chat/message_sender.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py
index 8d134847..fdeec346 100644
--- a/src/plugins/chat/message_sender.py
+++ b/src/plugins/chat/message_sender.py
@@ -146,7 +146,6 @@ class MessageManager:
"""管理所有聊天流的消息容器 (不再是单例)"""
def __init__(self):
- self._processor_task = None
self.containers: dict[str, MessageContainer] = {}
self.storage = MessageStorage() # 添加 storage 实例
self._running = True # 处理器运行状态