typing fix

This commit is contained in:
UnCLAS-Prommer
2025-07-25 19:56:01 +08:00
parent 28e004bbb0
commit 29229d9a36
4 changed files with 98 additions and 97 deletions

View File

@@ -12,7 +12,7 @@ from src.chat.message_receive.storage import MessageStorage
from src.chat.heart_flow.heartflow import heartflow from src.chat.heart_flow.heartflow import heartflow
from src.chat.utils.utils import is_mentioned_bot_in_message from src.chat.utils.utils import is_mentioned_bot_in_message
from src.chat.utils.timer_calculator import Timer from src.chat.utils.timer_calculator import Timer
from src.chat.utils.chat_message_builder import replace_user_references_in_content from src.chat.utils.chat_message_builder import replace_user_references_sync
from src.common.logger import get_logger from src.common.logger import get_logger
from src.person_info.relationship_manager import get_relationship_manager from src.person_info.relationship_manager import get_relationship_manager
from src.mood.mood_manager import mood_manager from src.mood.mood_manager import mood_manager
@@ -151,10 +151,9 @@ class HeartFCMessageReceiver:
processed_plain_text = re.sub(picid_pattern, "[图片]", message.processed_plain_text) processed_plain_text = re.sub(picid_pattern, "[图片]", message.processed_plain_text)
# 应用用户引用格式替换,将回复<aaa:bbb>和@<aaa:bbb>格式转换为可读格式 # 应用用户引用格式替换,将回复<aaa:bbb>和@<aaa:bbb>格式转换为可读格式
processed_plain_text = replace_user_references_in_content( processed_plain_text = replace_user_references_sync(
processed_plain_text, processed_plain_text,
message.message_info.platform, message.message_info.platform, # type: ignore
is_async=False,
replace_bot_name=True replace_bot_name=True
) )

View File

@@ -17,7 +17,11 @@ from src.chat.message_receive.uni_message_sender import HeartFCSender
from src.chat.utils.timer_calculator import Timer # <--- Import Timer from src.chat.utils.timer_calculator import Timer # <--- Import Timer
from src.chat.utils.utils import get_chat_type_and_target_info from src.chat.utils.utils import get_chat_type_and_target_info
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat, replace_user_references_in_content from src.chat.utils.chat_message_builder import (
build_readable_messages,
get_raw_msg_before_timestamp_with_chat,
replace_user_references_sync,
)
from src.chat.express.expression_selector import expression_selector from src.chat.express.expression_selector import expression_selector
from src.chat.knowledge.knowledge_lib import qa_manager from src.chat.knowledge.knowledge_lib import qa_manager
from src.chat.memory_system.memory_activator import MemoryActivator from src.chat.memory_system.memory_activator import MemoryActivator
@@ -30,6 +34,7 @@ from src.plugin_system.base.component_types import ActionInfo
logger = get_logger("replyer") logger = get_logger("replyer")
def init_prompt(): def init_prompt():
Prompt("你正在qq群里聊天下面是群里在聊的内容", "chat_target_group1") Prompt("你正在qq群里聊天下面是群里在聊的内容", "chat_target_group1")
Prompt("你正在和{sender_name}聊天,这是你们之前聊的内容:", "chat_target_private1") Prompt("你正在和{sender_name}聊天,这是你们之前聊的内容:", "chat_target_private1")
@@ -356,10 +361,14 @@ class DefaultReplyer:
expression_habits_block = "" expression_habits_block = ""
expression_habits_title = "" expression_habits_title = ""
if style_habits_str.strip(): if style_habits_str.strip():
expression_habits_title = "你可以参考以下的语言习惯,当情景合适就使用,但不要生硬使用,以合理的方式结合到你的回复中:" expression_habits_title = (
"你可以参考以下的语言习惯,当情景合适就使用,但不要生硬使用,以合理的方式结合到你的回复中:"
)
expression_habits_block += f"{style_habits_str}\n" expression_habits_block += f"{style_habits_str}\n"
if grammar_habits_str.strip(): if grammar_habits_str.strip():
expression_habits_title = "你可以选择下面的句法进行回复,如果情景合适就使用,不要盲目使用,不要生硬使用,以合理的方式使用:" expression_habits_title = (
"你可以选择下面的句法进行回复,如果情景合适就使用,不要盲目使用,不要生硬使用,以合理的方式使用:"
)
expression_habits_block += f"{grammar_habits_str}\n" expression_habits_block += f"{grammar_habits_str}\n"
if style_habits_str.strip() and grammar_habits_str.strip(): if style_habits_str.strip() and grammar_habits_str.strip():
@@ -367,7 +376,6 @@ class DefaultReplyer:
expression_habits_block = f"{expression_habits_title}\n{expression_habits_block}" expression_habits_block = f"{expression_habits_title}\n{expression_habits_block}"
return expression_habits_block return expression_habits_block
async def build_memory_block(self, chat_history, target): async def build_memory_block(self, chat_history, target):
@@ -630,13 +638,7 @@ class DefaultReplyer:
sender, target = self._parse_reply_target(reply_to) sender, target = self._parse_reply_target(reply_to)
target = replace_user_references_in_content( target = replace_user_references_sync(target, chat_stream.platform, replace_bot_name=True)
target,
chat_stream.platform,
is_async=False,
replace_bot_name=True
)
# 构建action描述 (如果启用planner) # 构建action描述 (如果启用planner)
action_descriptions = "" action_descriptions = ""
@@ -687,16 +689,12 @@ class DefaultReplyer:
self._time_and_run_task( self._time_and_run_task(
self.build_expression_habits(chat_talking_prompt_short, target), "expression_habits" self.build_expression_habits(chat_talking_prompt_short, target), "expression_habits"
), ),
self._time_and_run_task( self._time_and_run_task(self.build_relation_info(reply_data), "relation_info"),
self.build_relation_info(reply_data), "relation_info"
),
self._time_and_run_task(self.build_memory_block(chat_talking_prompt_short, target), "memory_block"), self._time_and_run_task(self.build_memory_block(chat_talking_prompt_short, target), "memory_block"),
self._time_and_run_task( self._time_and_run_task(
self.build_tool_info(chat_talking_prompt_short, reply_data, enable_tool=enable_tool), "tool_info" self.build_tool_info(chat_talking_prompt_short, reply_data, enable_tool=enable_tool), "tool_info"
), ),
self._time_and_run_task( self._time_and_run_task(get_prompt_info(target, threshold=0.38), "prompt_info"),
get_prompt_info(target, threshold=0.38), "prompt_info"
),
) )
# 任务名称中英文映射 # 任务名称中英文映射
@@ -705,7 +703,7 @@ class DefaultReplyer:
"relation_info": "感受关系", "relation_info": "感受关系",
"memory_block": "回忆", "memory_block": "回忆",
"tool_info": "使用工具", "tool_info": "使用工具",
"prompt_info": "获取知识" "prompt_info": "获取知识",
} }
# 处理结果 # 处理结果
@@ -815,10 +813,9 @@ class DefaultReplyer:
-------------------------------- --------------------------------
{time_block} {time_block}
这是你和{sender}的对话,你们正在交流中: 这是你和{sender}的对话,你们正在交流中:
{core_dialogue_prompt}""" {core_dialogue_prompt}""",
) )
# 使用 s4u 风格的模板 # 使用 s4u 风格的模板
template_name = "s4u_style_prompt" template_name = "s4u_style_prompt"
@@ -855,7 +852,7 @@ class DefaultReplyer:
identity_block=identity_block, identity_block=identity_block,
sender=sender, sender=sender,
target=target, target=target,
chat_info=chat_talking_prompt chat_info=chat_talking_prompt,
) )
# 使用原有的模式 # 使用原有的模式
@@ -1081,7 +1078,9 @@ async def get_prompt_info(message: str, threshold: float):
logger.debug(f"获取知识库内容,相关信息:{related_info[:100]}...,信息长度: {len(related_info)}") logger.debug(f"获取知识库内容,相关信息:{related_info[:100]}...,信息长度: {len(related_info)}")
# 格式化知识信息 # 格式化知识信息
formatted_prompt_info = await global_prompt_manager.format_prompt("knowledge_prompt", prompt_info=related_info) formatted_prompt_info = await global_prompt_manager.format_prompt(
"knowledge_prompt", prompt_info=related_info
)
return formatted_prompt_info return formatted_prompt_info
else: else:
logger.debug("从LPMM知识库获取知识失败可能是从未导入过知识返回空知识...") logger.debug("从LPMM知识库获取知识失败可能是从未导入过知识返回空知识...")

View File

@@ -2,7 +2,7 @@ import time # 导入 time 模块以获取当前时间
import random import random
import re import re
from typing import List, Dict, Any, Tuple, Optional, Union, Callable from typing import List, Dict, Any, Tuple, Optional, Callable
from rich.traceback import install from rich.traceback import install
from src.config.config import global_config from src.config.config import global_config
@@ -15,13 +15,12 @@ from src.chat.utils.utils import translate_timestamp_to_human_readable,assign_me
install(extra_lines=3) install(extra_lines=3)
def replace_user_references_in_content( def replace_user_references_sync(
content: str, content: str,
platform: str, platform: str,
name_resolver: Union[Callable[[str, str], str], Callable[[str, str], Any]] = None, name_resolver: Optional[Callable[[str, str], str]] = None,
is_async: bool = False, replace_bot_name: bool = True,
replace_bot_name: bool = True ) -> str:
) -> Union[str, Any]:
""" """
替换内容中的用户引用格式,包括回复<aaa:bbb>和@<aaa:bbb>格式 替换内容中的用户引用格式,包括回复<aaa:bbb>和@<aaa:bbb>格式
@@ -30,41 +29,29 @@ def replace_user_references_in_content(
platform: 平台标识 platform: 平台标识
name_resolver: 名称解析函数,接收(platform, user_id)参数,返回用户名称 name_resolver: 名称解析函数,接收(platform, user_id)参数,返回用户名称
如果为None则使用默认的person_info_manager 如果为None则使用默认的person_info_manager
is_async: 是否为异步模式
replace_bot_name: 是否将机器人的user_id替换为"机器人昵称(你)" replace_bot_name: 是否将机器人的user_id替换为"机器人昵称(你)"
Returns: Returns:
处理后的内容字符串同步模式或awaitable对象异步模式 str: 处理后的内容字符串
""" """
if is_async:
return _replace_user_references_async(content, platform, name_resolver, replace_bot_name)
else:
return _replace_user_references_sync(content, platform, name_resolver, replace_bot_name)
def _replace_user_references_sync(
content: str,
platform: str,
name_resolver: Optional[Callable[[str, str], str]] = None,
replace_bot_name: bool = True
) -> str:
"""同步版本的用户引用替换"""
if name_resolver is None: if name_resolver is None:
person_info_manager = get_person_info_manager() person_info_manager = get_person_info_manager()
def default_resolver(platform: str, user_id: str) -> str: def default_resolver(platform: str, user_id: str) -> str:
# 检查是否是机器人自己 # 检查是否是机器人自己
if replace_bot_name and user_id == global_config.bot.qq_account: if replace_bot_name and user_id == global_config.bot.qq_account:
return f"{global_config.bot.nickname}(你)" return f"{global_config.bot.nickname}(你)"
person_id = PersonInfoManager.get_person_id(platform, user_id) person_id = PersonInfoManager.get_person_id(platform, user_id)
return person_info_manager.get_value_sync(person_id, "person_name") or user_id return person_info_manager.get_value_sync(person_id, "person_name") or user_id # type: ignore
name_resolver = default_resolver name_resolver = default_resolver
# 处理回复<aaa:bbb>格式 # 处理回复<aaa:bbb>格式
reply_pattern = r"回复<([^:<>]+):([^:<>]+)>" reply_pattern = r"回复<([^:<>]+):([^:<>]+)>"
match = re.search(reply_pattern, content) match = re.search(reply_pattern, content)
if match: if match:
aaa = match.group(1) aaa = match[1]
bbb = match.group(2) bbb = match[2]
try: try:
# 检查是否是机器人自己 # 检查是否是机器人自己
if replace_bot_name and bbb == global_config.bot.qq_account: if replace_bot_name and bbb == global_config.bot.qq_account:
@@ -103,21 +90,35 @@ def _replace_user_references_sync(
return content return content
async def _replace_user_references_async( async def replace_user_references_async(
content: str, content: str,
platform: str, platform: str,
name_resolver: Optional[Callable[[str, str], Any]] = None, name_resolver: Optional[Callable[[str, str], Any]] = None,
replace_bot_name: bool = True replace_bot_name: bool = True,
) -> str: ) -> str:
"""异步版本的用户引用替换""" """
替换内容中的用户引用格式,包括回复<aaa:bbb>和@<aaa:bbb>格式
Args:
content: 要处理的内容字符串
platform: 平台标识
name_resolver: 名称解析函数,接收(platform, user_id)参数,返回用户名称
如果为None则使用默认的person_info_manager
replace_bot_name: 是否将机器人的user_id替换为"机器人昵称(你)"
Returns:
str: 处理后的内容字符串
"""
if name_resolver is None: if name_resolver is None:
person_info_manager = get_person_info_manager() person_info_manager = get_person_info_manager()
async def default_resolver(platform: str, user_id: str) -> str: async def default_resolver(platform: str, user_id: str) -> str:
# 检查是否是机器人自己 # 检查是否是机器人自己
if replace_bot_name and user_id == global_config.bot.qq_account: if replace_bot_name and user_id == global_config.bot.qq_account:
return f"{global_config.bot.nickname}(你)" return f"{global_config.bot.nickname}(你)"
person_id = PersonInfoManager.get_person_id(platform, user_id) person_id = PersonInfoManager.get_person_id(platform, user_id)
return await person_info_manager.get_value(person_id, "person_name") or user_id return await person_info_manager.get_value(person_id, "person_name") or user_id # type: ignore
name_resolver = default_resolver name_resolver = default_resolver
# 处理回复<aaa:bbb>格式 # 处理回复<aaa:bbb>格式
@@ -524,7 +525,7 @@ def _build_readable_messages_internal(
person_name = "某人" person_name = "某人"
# 使用独立函数处理用户引用格式 # 使用独立函数处理用户引用格式
content = replace_user_references_in_content(content, platform, is_async=False, replace_bot_name=replace_bot_name) content = replace_user_references_sync(content, platform, replace_bot_name=replace_bot_name)
target_str = "这是QQ的一个功能用于提及某人但没那么明显" target_str = "这是QQ的一个功能用于提及某人但没那么明显"
if target_str in content and random.random() < 0.6: if target_str in content and random.random() < 0.6:
@@ -778,6 +779,7 @@ async def build_readable_messages_with_list(
return formatted_string, details_list return formatted_string, details_list
def build_readable_messages_with_id( def build_readable_messages_with_id(
messages: List[Dict[str, Any]], messages: List[Dict[str, Any]],
replace_bot_name: bool = True, replace_bot_name: bool = True,
@@ -806,9 +808,6 @@ def build_readable_messages_with_id(
message_id_list=message_id_list, message_id_list=message_id_list,
) )
return formatted_string, message_id_list return formatted_string, message_id_list
@@ -894,7 +893,13 @@ def build_readable_messages(
if read_mark <= 0: if read_mark <= 0:
# 没有有效的 read_mark直接格式化所有消息 # 没有有效的 read_mark直接格式化所有消息
formatted_string, _, pic_id_mapping, _ = _build_readable_messages_internal( formatted_string, _, pic_id_mapping, _ = _build_readable_messages_internal(
copy_messages, replace_bot_name, merge_messages, timestamp_mode, truncate, show_pic=show_pic, message_id_list=message_id_list copy_messages,
replace_bot_name,
merge_messages,
timestamp_mode,
truncate,
show_pic=show_pic,
message_id_list=message_id_list,
) )
# 生成图片映射信息并添加到最前面 # 生成图片映射信息并添加到最前面
@@ -1017,7 +1022,7 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
for msg in messages: for msg in messages:
try: try:
platform = msg.get("chat_info_platform") platform: str = msg.get("chat_info_platform") # type: ignore
user_id = msg.get("user_id") user_id = msg.get("user_id")
_timestamp = msg.get("time") _timestamp = msg.get("time")
content: str = "" content: str = ""
@@ -1047,7 +1052,7 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
except Exception: except Exception:
return "?" return "?"
content = replace_user_references_in_content(content, platform, anon_name_resolver, is_async=False, replace_bot_name=False) content = replace_user_references_sync(content, platform, anon_name_resolver, replace_bot_name=False)
header = f"{anon_name}" header = f"{anon_name}"
output_lines.append(header) output_lines.append(header)

View File

@@ -19,11 +19,9 @@
await send_api.custom_message("video", video_data, "123456", True) await send_api.custom_message("video", video_data, "123456", True)
""" """
import asyncio
import traceback import traceback
import time import time
import difflib import difflib
import re
from typing import Optional, Union from typing import Optional, Union
from src.common.logger import get_logger from src.common.logger import get_logger
@@ -31,7 +29,7 @@ from src.common.logger import get_logger
from src.chat.message_receive.chat_stream import get_chat_manager from src.chat.message_receive.chat_stream import get_chat_manager
from src.chat.message_receive.uni_message_sender import HeartFCSender from src.chat.message_receive.uni_message_sender import HeartFCSender
from src.chat.message_receive.message import MessageSending, MessageRecv from src.chat.message_receive.message import MessageSending, MessageRecv
from src.chat.utils.chat_message_builder import get_raw_msg_before_timestamp_with_chat, replace_user_references_in_content from src.chat.utils.chat_message_builder import get_raw_msg_before_timestamp_with_chat, replace_user_references_async
from src.person_info.person_info import get_person_info_manager from src.person_info.person_info import get_person_info_manager
from maim_message import Seg, UserInfo from maim_message import Seg, UserInfo
from src.config.config import global_config from src.config.config import global_config
@@ -185,7 +183,7 @@ async def _find_reply_message(target_stream, reply_to: str) -> Optional[MessageR
translate_text = message["processed_plain_text"] translate_text = message["processed_plain_text"]
# 使用独立函数处理用户引用格式 # 使用独立函数处理用户引用格式
translate_text = await replace_user_references_in_content(translate_text, platform, is_async=True) translate_text = await replace_user_references_async(translate_text, platform)
similarity = difflib.SequenceMatcher(None, text, translate_text).ratio() similarity = difflib.SequenceMatcher(None, text, translate_text).ratio()
if similarity >= 0.9: if similarity >= 0.9: