fix:为focus添加超时保护
This commit is contained in:
@@ -88,6 +88,7 @@ class ExpressionLearner:
|
|||||||
current_chat_type = "group"
|
current_chat_type = "group"
|
||||||
typed_chat_id = f"{platform}:{chat_stream.group_info.group_id}:{current_chat_type}"
|
typed_chat_id = f"{platform}:{chat_stream.group_info.group_id}:{current_chat_type}"
|
||||||
else:
|
else:
|
||||||
|
current_chat_type = "private"
|
||||||
typed_chat_id = f"{platform}:{chat_stream.user_info.user_id}:{current_chat_type}"
|
typed_chat_id = f"{platform}:{chat_stream.user_info.user_id}:{current_chat_type}"
|
||||||
|
|
||||||
logger.info(f"正在为 {typed_chat_id} 查找互通组...")
|
logger.info(f"正在为 {typed_chat_id} 查找互通组...")
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from src.chat.heart_flow.observation.observation import Observation
|
|||||||
from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail
|
from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail
|
||||||
from src.chat.focus_chat.info.info_base import InfoBase
|
from src.chat.focus_chat.info.info_base import InfoBase
|
||||||
from src.chat.focus_chat.info_processors.chattinginfo_processor import ChattingInfoProcessor
|
from src.chat.focus_chat.info_processors.chattinginfo_processor import ChattingInfoProcessor
|
||||||
from src.chat.focus_chat.info_processors.relationship_processor import RelationshipProcessor
|
from src.chat.focus_chat.info_processors.relationship_processor import PersonImpressionpProcessor
|
||||||
from src.chat.focus_chat.info_processors.working_memory_processor import WorkingMemoryProcessor
|
from src.chat.focus_chat.info_processors.working_memory_processor import WorkingMemoryProcessor
|
||||||
from src.chat.heart_flow.observation.hfcloop_observation import HFCloopObservation
|
from src.chat.heart_flow.observation.hfcloop_observation import HFCloopObservation
|
||||||
from src.chat.heart_flow.observation.working_observation import WorkingMemoryObservation
|
from src.chat.heart_flow.observation.working_observation import WorkingMemoryObservation
|
||||||
@@ -31,6 +31,10 @@ from src.config.config import global_config
|
|||||||
|
|
||||||
install(extra_lines=3)
|
install(extra_lines=3)
|
||||||
|
|
||||||
|
# 超时常量配置
|
||||||
|
MEMORY_ACTIVATION_TIMEOUT = 5.0 # 记忆激活任务超时时限(秒)
|
||||||
|
ACTION_MODIFICATION_TIMEOUT = 15.0 # 动作修改任务超时时限(秒)
|
||||||
|
|
||||||
# 定义观察器映射:键是观察器名称,值是 (观察器类, 初始化参数)
|
# 定义观察器映射:键是观察器名称,值是 (观察器类, 初始化参数)
|
||||||
OBSERVATION_CLASSES = {
|
OBSERVATION_CLASSES = {
|
||||||
"ChattingObservation": (ChattingObservation, "chat_id"),
|
"ChattingObservation": (ChattingObservation, "chat_id"),
|
||||||
@@ -44,7 +48,7 @@ PROCESSOR_CLASSES = {
|
|||||||
"ChattingInfoProcessor": (ChattingInfoProcessor, None),
|
"ChattingInfoProcessor": (ChattingInfoProcessor, None),
|
||||||
"ToolProcessor": (ToolProcessor, "tool_use_processor"),
|
"ToolProcessor": (ToolProcessor, "tool_use_processor"),
|
||||||
"WorkingMemoryProcessor": (WorkingMemoryProcessor, "working_memory_processor"),
|
"WorkingMemoryProcessor": (WorkingMemoryProcessor, "working_memory_processor"),
|
||||||
"RelationshipProcessor": (RelationshipProcessor, "relation_processor"),
|
"PersonImpressionpProcessor": (PersonImpressionpProcessor, "person_impression_processor"),
|
||||||
"ExpressionSelectorProcessor": (ExpressionSelectorProcessor, "expression_selector_processor"),
|
"ExpressionSelectorProcessor": (ExpressionSelectorProcessor, "expression_selector_processor"),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +110,7 @@ class HeartFChatting:
|
|||||||
|
|
||||||
for proc_name, (_proc_class, config_key) in PROCESSOR_CLASSES.items():
|
for proc_name, (_proc_class, config_key) in PROCESSOR_CLASSES.items():
|
||||||
# 对于关系处理器,需要同时检查两个配置项
|
# 对于关系处理器,需要同时检查两个配置项
|
||||||
if proc_name == "RelationshipProcessor":
|
if proc_name == "PersonImpressionpProcessor":
|
||||||
if global_config.relationship.enable_relationship and getattr(
|
if global_config.relationship.enable_relationship and getattr(
|
||||||
config_processor_settings, config_key, True
|
config_processor_settings, config_key, True
|
||||||
):
|
):
|
||||||
@@ -182,7 +186,7 @@ class HeartFChatting:
|
|||||||
if name in [
|
if name in [
|
||||||
"ToolProcessor",
|
"ToolProcessor",
|
||||||
"WorkingMemoryProcessor",
|
"WorkingMemoryProcessor",
|
||||||
"RelationshipProcessor",
|
"PersonImpressionpProcessor",
|
||||||
"ExpressionSelectorProcessor",
|
"ExpressionSelectorProcessor",
|
||||||
]:
|
]:
|
||||||
self.processors.append(processor_actual_class(subheartflow_id=self.stream_id))
|
self.processors.append(processor_actual_class(subheartflow_id=self.stream_id))
|
||||||
@@ -560,21 +564,72 @@ class HeartFChatting:
|
|||||||
self.observations.append(self.action_observation)
|
self.observations.append(self.action_observation)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# 创建三个并行任务
|
# 创建三个并行任务,为LLM调用添加超时保护
|
||||||
action_modify_task = asyncio.create_task(modify_actions_task())
|
action_modify_task = asyncio.create_task(
|
||||||
memory_task = asyncio.create_task(self.memory_activator.activate_memory(self.observations))
|
asyncio.wait_for(
|
||||||
|
modify_actions_task(),
|
||||||
|
timeout=ACTION_MODIFICATION_TIMEOUT
|
||||||
|
)
|
||||||
|
)
|
||||||
|
memory_task = asyncio.create_task(
|
||||||
|
asyncio.wait_for(
|
||||||
|
self.memory_activator.activate_memory(self.observations),
|
||||||
|
timeout=MEMORY_ACTIVATION_TIMEOUT
|
||||||
|
)
|
||||||
|
)
|
||||||
processor_task = asyncio.create_task(self._process_processors(self.observations))
|
processor_task = asyncio.create_task(self._process_processors(self.observations))
|
||||||
|
|
||||||
# 等待三个任务完成
|
# 等待三个任务完成,使用超时保护和详细错误处理
|
||||||
_, running_memorys, (all_plan_info, processor_time_costs) = await asyncio.gather(
|
action_modify_result = None
|
||||||
action_modify_task, memory_task, processor_task
|
running_memorys = []
|
||||||
)
|
all_plan_info = []
|
||||||
|
processor_time_costs = {}
|
||||||
|
|
||||||
|
try:
|
||||||
|
action_modify_result, running_memorys, (all_plan_info, processor_time_costs) = await asyncio.gather(
|
||||||
|
action_modify_task, memory_task, processor_task,
|
||||||
|
return_exceptions=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# 检查各个任务的结果
|
||||||
|
if isinstance(action_modify_result, Exception):
|
||||||
|
if isinstance(action_modify_result, asyncio.TimeoutError):
|
||||||
|
logger.error(f"{self.log_prefix} 动作修改任务超时")
|
||||||
|
else:
|
||||||
|
logger.error(f"{self.log_prefix} 动作修改任务失败: {action_modify_result}")
|
||||||
|
|
||||||
|
if isinstance(running_memorys, Exception):
|
||||||
|
if isinstance(running_memorys, asyncio.TimeoutError):
|
||||||
|
logger.error(f"{self.log_prefix} 记忆激活任务超时")
|
||||||
|
else:
|
||||||
|
logger.error(f"{self.log_prefix} 记忆激活任务失败: {running_memorys}")
|
||||||
|
running_memorys = []
|
||||||
|
|
||||||
|
processor_result = (all_plan_info, processor_time_costs)
|
||||||
|
if isinstance(processor_result, Exception):
|
||||||
|
if isinstance(processor_result, asyncio.TimeoutError):
|
||||||
|
logger.error(f"{self.log_prefix} 处理器任务超时")
|
||||||
|
else:
|
||||||
|
logger.error(f"{self.log_prefix} 处理器任务失败: {processor_result}")
|
||||||
|
all_plan_info = []
|
||||||
|
processor_time_costs = {}
|
||||||
|
else:
|
||||||
|
all_plan_info, processor_time_costs = processor_result
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"{self.log_prefix} 并行任务gather失败: {e}")
|
||||||
|
# 设置默认值以继续执行
|
||||||
|
running_memorys = []
|
||||||
|
all_plan_info = []
|
||||||
|
processor_time_costs = {}
|
||||||
|
|
||||||
loop_processor_info = {
|
loop_processor_info = {
|
||||||
"all_plan_info": all_plan_info,
|
"all_plan_info": all_plan_info,
|
||||||
"processor_time_costs": processor_time_costs,
|
"processor_time_costs": processor_time_costs,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.debug(f"{self.log_prefix} 并行阶段完成,准备进入规划器,plan_info数量: {len(all_plan_info)}, running_memorys数量: {len(running_memorys)}")
|
||||||
|
|
||||||
with Timer("规划器", cycle_timers):
|
with Timer("规划器", cycle_timers):
|
||||||
plan_result = await self.action_planner.plan(all_plan_info, running_memorys, loop_start_time)
|
plan_result = await self.action_planner.plan(all_plan_info, running_memorys, loop_start_time)
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ def init_prompt():
|
|||||||
Prompt(fetch_bot_info_prompt, "fetch_bot_info_prompt")
|
Prompt(fetch_bot_info_prompt, "fetch_bot_info_prompt")
|
||||||
|
|
||||||
|
|
||||||
class RelationshipProcessor(BaseProcessor):
|
class PersonImpressionpProcessor(BaseProcessor):
|
||||||
log_prefix = "关系"
|
log_prefix = "关系"
|
||||||
|
|
||||||
def __init__(self, subheartflow_id: str):
|
def __init__(self, subheartflow_id: str):
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ class FocusChatConfig(ConfigBase):
|
|||||||
class FocusChatProcessorConfig(ConfigBase):
|
class FocusChatProcessorConfig(ConfigBase):
|
||||||
"""专注聊天处理器配置类"""
|
"""专注聊天处理器配置类"""
|
||||||
|
|
||||||
relation_processor: bool = True
|
person_impression_processor: bool = True
|
||||||
"""是否启用关系识别处理器"""
|
"""是否启用关系识别处理器"""
|
||||||
|
|
||||||
tool_use_processor: bool = True
|
tool_use_processor: bool = True
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ compressed_length = 8 # 不能大于observation_context_size,心流上下文压
|
|||||||
compress_length_limit = 4 #最多压缩份数,超过该数值的压缩上下文会被删除
|
compress_length_limit = 4 #最多压缩份数,超过该数值的压缩上下文会被删除
|
||||||
|
|
||||||
[focus_chat_processor] # 专注聊天处理器,打开可以实现更多功能,但是会增加token消耗
|
[focus_chat_processor] # 专注聊天处理器,打开可以实现更多功能,但是会增加token消耗
|
||||||
relation_processor = true # 是否启用关系识别处理器
|
person_impression_processor = true # 是否启用关系识别处理器
|
||||||
tool_use_processor = false # 是否启用工具使用处理器
|
tool_use_processor = false # 是否启用工具使用处理器
|
||||||
working_memory_processor = false # 是否启用工作记忆处理器,消耗量大
|
working_memory_processor = false # 是否启用工作记忆处理器,消耗量大
|
||||||
expression_selector_processor = true # 是否启用表达方式选择处理器
|
expression_selector_processor = true # 是否启用表达方式选择处理器
|
||||||
|
|||||||
Reference in New Issue
Block a user