refactor(chat): 优化跨群聊上下文构建与代码格式

对 `default_generator.py` 进行了多项重构和优化:
- 将跨群聊上下文的构建逻辑移入独立的 `_build_cross_context_block` 方法,并在主流程中异步并行执行,提高了代码的模块化和执行效率。
- 全面清理了代码中的多余空行和不一致的间距,提升了代码的可读性和一致性。
- 调整了 `NoReplyAction` 和 `ReplyAction` 的 `mode_enable` 配置,使其行为更符合预期。
This commit is contained in:
minecraft1024a
2025-08-22 13:37:59 +08:00
parent 365411dc53
commit 5c7bdfb069
3 changed files with 72 additions and 59 deletions

View File

@@ -230,10 +230,7 @@ class DefaultReplyer:
self.heart_fc_sender = HeartFCSender() self.heart_fc_sender = HeartFCSender()
self.memory_activator = MemoryActivator() self.memory_activator = MemoryActivator()
# 使用纯向量瞬时记忆系统V2支持自定义保留时间 # 使用纯向量瞬时记忆系统V2支持自定义保留时间
self.instant_memory = VectorInstantMemoryV2( self.instant_memory = VectorInstantMemoryV2(chat_id=self.chat_stream.stream_id, retention_hours=1)
chat_id=self.chat_stream.stream_id,
retention_hours=1
)
from src.plugin_system.core.tool_use import ToolExecutor # 延迟导入ToolExecutor不然会循环依赖 from src.plugin_system.core.tool_use import ToolExecutor # 延迟导入ToolExecutor不然会循环依赖
@@ -269,12 +266,13 @@ class DefaultReplyer:
# normal模式获取其他群聊的最近N条消息 # normal模式获取其他群聊的最近N条消息
for chat_raw_id in other_chat_raw_ids: for chat_raw_id in other_chat_raw_ids:
stream_id = get_chat_manager().get_stream_id(current_stream.platform, chat_raw_id, is_group=True) stream_id = get_chat_manager().get_stream_id(current_stream.platform, chat_raw_id, is_group=True)
if not stream_id: continue if not stream_id:
continue
messages = get_raw_msg_before_timestamp_with_chat( messages = get_raw_msg_before_timestamp_with_chat(
chat_id=stream_id, chat_id=stream_id,
timestamp=time.time(), timestamp=time.time(),
limit=5 # 可配置 limit=5, # 可配置
) )
if messages: if messages:
chat_name = get_chat_manager().get_stream_name(stream_id) or stream_id chat_name = get_chat_manager().get_stream_name(stream_id) or stream_id
@@ -288,21 +286,32 @@ class DefaultReplyer:
if user_id: if user_id:
for chat_raw_id in other_chat_raw_ids: for chat_raw_id in other_chat_raw_ids:
stream_id = get_chat_manager().get_stream_id(current_stream.platform, chat_raw_id, is_group=True) stream_id = get_chat_manager().get_stream_id(
if not stream_id: continue current_stream.platform, chat_raw_id, is_group=True
)
if not stream_id:
continue
messages = get_raw_msg_before_timestamp_with_chat( messages = get_raw_msg_before_timestamp_with_chat(
chat_id=stream_id, chat_id=stream_id,
timestamp=time.time(), timestamp=time.time(),
limit=20 # 获取更多消息以供筛选 limit=20, # 获取更多消息以供筛选
) )
user_messages = [msg for msg in messages if msg.get('user_id') == user_id][-5:] # 筛选并取最近5条 user_messages = [msg for msg in messages if msg.get("user_id") == user_id][
-5:
] # 筛选并取最近5条
if user_messages: if user_messages:
chat_name = get_chat_manager().get_stream_name(stream_id) or stream_id chat_name = get_chat_manager().get_stream_name(stream_id) or stream_id
user_name = target_user_info.get("person_name") or target_user_info.get("user_nickname") or user_id user_name = (
formatted_messages, _ = build_readable_messages_with_id(user_messages, timestamp_mode="relative") target_user_info.get("person_name") or target_user_info.get("user_nickname") or user_id
cross_context_messages.append(f"[以下是“{user_name}”在“{chat_name}”的近期发言]\n{formatted_messages}") )
formatted_messages, _ = build_readable_messages_with_id(
user_messages, timestamp_mode="relative"
)
cross_context_messages.append(
f"[以下是“{user_name}”在“{chat_name}”的近期发言]\n{formatted_messages}"
)
if not cross_context_messages: if not cross_context_messages:
return "" return ""
@@ -567,27 +576,22 @@ class DefaultReplyer:
try: try:
from src.chat.memory_system.async_memory_optimizer import ( from src.chat.memory_system.async_memory_optimizer import (
retrieve_memory_nonblocking, retrieve_memory_nonblocking,
store_memory_nonblocking store_memory_nonblocking,
) )
# 异步存储聊天历史(非阻塞) # 异步存储聊天历史(非阻塞)
asyncio.create_task(store_memory_nonblocking( asyncio.create_task(
chat_id=self.chat_stream.stream_id, store_memory_nonblocking(chat_id=self.chat_stream.stream_id, content=chat_history)
content=chat_history )
))
# 尝试从缓存获取瞬时记忆 # 尝试从缓存获取瞬时记忆
instant_memory = await retrieve_memory_nonblocking( instant_memory = await retrieve_memory_nonblocking(chat_id=self.chat_stream.stream_id, query=target)
chat_id=self.chat_stream.stream_id,
query=target
)
# 如果没有缓存结果,快速检索一次 # 如果没有缓存结果,快速检索一次
if instant_memory is None: if instant_memory is None:
try: try:
instant_memory = await asyncio.wait_for( instant_memory = await asyncio.wait_for(
self.instant_memory.get_memory_for_context(target), self.instant_memory.get_memory_for_context(target), timeout=1.5
timeout=1.5
) )
except asyncio.TimeoutError: except asyncio.TimeoutError:
logger.warning("瞬时记忆检索超时,使用空结果") logger.warning("瞬时记忆检索超时,使用空结果")
@@ -606,7 +610,7 @@ class DefaultReplyer:
try: try:
instant_memory = await asyncio.wait_for( instant_memory = await asyncio.wait_for(
self.instant_memory.get_memory_for_context(target), self.instant_memory.get_memory_for_context(target),
timeout=1.0 # 最保守的1秒超时 timeout=1.0, # 最保守的1秒超时
) )
except asyncio.TimeoutError: except asyncio.TimeoutError:
logger.warning("瞬时记忆检索超时,跳过记忆获取") logger.warning("瞬时记忆检索超时,跳过记忆获取")
@@ -958,7 +962,12 @@ class DefaultReplyer:
show_actions=True, show_actions=True,
) )
# 并行执行五个构建任务 # 获取目标用户信息用于s4u模式
target_user_info = None
if sender:
target_user_info = await person_info_manager.get_person_info_by_name(sender)
# 并行执行六个构建任务
task_results = await asyncio.gather( task_results = await asyncio.gather(
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"
@@ -969,6 +978,7 @@ class DefaultReplyer:
self.build_tool_info(chat_talking_prompt_short, reply_to, enable_tool=enable_tool), "tool_info" self.build_tool_info(chat_talking_prompt_short, reply_to, enable_tool=enable_tool), "tool_info"
), ),
self._time_and_run_task(self.get_prompt_info(chat_talking_prompt_short, reply_to), "prompt_info"), self._time_and_run_task(self.get_prompt_info(chat_talking_prompt_short, reply_to), "prompt_info"),
self._time_and_run_task(self._build_cross_context_block(chat_id, target_user_info), "cross_context"),
) )
# 任务名称中英文映射 # 任务名称中英文映射
@@ -995,7 +1005,8 @@ class DefaultReplyer:
relation_info = results_dict["relation_info"] relation_info = results_dict["relation_info"]
memory_block = results_dict["memory_block"] memory_block = results_dict["memory_block"]
tool_info = results_dict["tool_info"] tool_info = results_dict["tool_info"]
prompt_info = results_dict["prompt_info"] # 直接使用格式化后的结果 prompt_info = results_dict["prompt_info"]
cross_context_block = results_dict["cross_context"]
keywords_reaction_prompt = await self.build_keywords_reaction_prompt(target) keywords_reaction_prompt = await self.build_keywords_reaction_prompt(target)
@@ -1147,13 +1158,14 @@ class DefaultReplyer:
identity=identity_block, identity=identity_block,
schedule_block=schedule_block, schedule_block=schedule_block,
action_descriptions=action_descriptions, action_descriptions=action_descriptions,
time_block=time_block, # 保留time_block参数 time_block=time_block,
chat_info=chat_info, chat_info=chat_info,
reply_target_block=reply_target_block, reply_target_block=reply_target_block,
mood_state=mood_prompt, mood_state=mood_prompt,
config_expression_style=config_expression_style, config_expression_style=config_expression_style,
keywords_reaction_prompt=keywords_reaction_prompt, keywords_reaction_prompt=keywords_reaction_prompt,
moderation_prompt=moderation_prompt_block, moderation_prompt=moderation_prompt_block,
cross_context_block=cross_context_block,
) )
return result return result
else: else:
@@ -1192,6 +1204,7 @@ class DefaultReplyer:
reply_style=global_config.personality.reply_style, reply_style=global_config.personality.reply_style,
keywords_reaction_prompt=keywords_reaction_prompt, keywords_reaction_prompt=keywords_reaction_prompt,
moderation_prompt=moderation_prompt_block, moderation_prompt=moderation_prompt_block,
cross_context_block=cross_context_block,
) )
logger.debug(f"[Prompt模式调试] s4u format_prompt调用完成结果预览: {result[:200]}...") logger.debug(f"[Prompt模式调试] s4u format_prompt调用完成结果预览: {result[:200]}...")
return result return result

View File

@@ -16,7 +16,7 @@ class NoReplyAction(BaseAction):
focus_activation_type = ActionActivationType.ALWAYS # 修复在focus模式下应该始终可用 focus_activation_type = ActionActivationType.ALWAYS # 修复在focus模式下应该始终可用
normal_activation_type = ActionActivationType.ALWAYS # 修复在normal模式下应该始终可用 normal_activation_type = ActionActivationType.ALWAYS # 修复在normal模式下应该始终可用
mode_enable = ChatMode.FOCUS | ChatMode.NORMAL # 修复:在所有模式下都可用 mode_enable = ChatMode.FOCUS # 修复:在所有模式下都可用 # 二次修复:这玩意只有专注下才有用的好吗
parallel_action = False parallel_action = False
# 动作基本信息 # 动作基本信息

View File

@@ -16,7 +16,7 @@ class ReplyAction(BaseAction):
focus_activation_type = ActionActivationType.ALWAYS focus_activation_type = ActionActivationType.ALWAYS
normal_activation_type = ActionActivationType.ALWAYS normal_activation_type = ActionActivationType.ALWAYS
mode_enable = ChatMode.FOCUS | ChatMode.NORMAL mode_enable = ChatMode.ALL
parallel_action = False parallel_action = False
# 动作基本信息 # 动作基本信息