fix:修复msg_id为正确提取导致的聊天退出错误
This commit is contained in:
@@ -264,9 +264,14 @@ class ExpressionSelector:
|
|||||||
|
|
||||||
# 4. 调用LLM
|
# 4. 调用LLM
|
||||||
try:
|
try:
|
||||||
content, _ = await self.llm_model.generate_response_async(prompt=prompt)
|
content, (reasoning_content, model_name, _) = await self.llm_model.generate_response_async(prompt=prompt)
|
||||||
|
|
||||||
# logger.info(f"{self.log_prefix} LLM返回结果: {content}")
|
# logger.info(f"模型名称: {model_name}")
|
||||||
|
# logger.info(f"LLM返回结果: {content}")
|
||||||
|
# if reasoning_content:
|
||||||
|
# logger.info(f"LLM推理: {reasoning_content}")
|
||||||
|
# else:
|
||||||
|
# logger.info(f"LLM推理: 无")
|
||||||
|
|
||||||
if not content:
|
if not content:
|
||||||
logger.warning("LLM返回空结果")
|
logger.warning("LLM返回空结果")
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ class ActionPlanner:
|
|||||||
self.planner_llm = LLMRequest(model_set=model_config.model_task_config.planner, request_type="planner") # 用于动作规划
|
self.planner_llm = LLMRequest(model_set=model_config.model_task_config.planner, request_type="planner") # 用于动作规划
|
||||||
|
|
||||||
self.last_obs_time_mark = 0.0
|
self.last_obs_time_mark = 0.0
|
||||||
|
# 添加重试计数器
|
||||||
|
self.plan_retry_count = 0
|
||||||
|
self.max_plan_retries = 3
|
||||||
|
|
||||||
def find_message_by_id(self, message_id: str, message_id_list: list) -> Optional[Dict[str, Any]]:
|
def find_message_by_id(self, message_id: str, message_id_list: list) -> Optional[Dict[str, Any]]:
|
||||||
# sourcery skip: use-next
|
# sourcery skip: use-next
|
||||||
@@ -92,6 +95,21 @@ class ActionPlanner:
|
|||||||
return item.get("message")
|
return item.get("message")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_latest_message(self, message_id_list: list) -> Optional[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
获取消息列表中的最新消息
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message_id_list: 消息ID列表,格式为[{'id': str, 'message': dict}, ...]
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
最新的消息字典,如果列表为空则返回None
|
||||||
|
"""
|
||||||
|
if not message_id_list:
|
||||||
|
return None
|
||||||
|
# 假设消息列表是按时间顺序排列的,最后一个是最新的
|
||||||
|
return message_id_list[-1].get("message")
|
||||||
|
|
||||||
async def plan(
|
async def plan(
|
||||||
self, mode: ChatMode = ChatMode.FOCUS
|
self, mode: ChatMode = ChatMode.FOCUS
|
||||||
) -> Tuple[Dict[str, Dict[str, Any] | str], Optional[Dict[str, Any]]]:
|
) -> Tuple[Dict[str, Dict[str, Any] | str], Optional[Dict[str, Any]]]:
|
||||||
@@ -105,6 +123,7 @@ class ActionPlanner:
|
|||||||
current_available_actions: Dict[str, ActionInfo] = {}
|
current_available_actions: Dict[str, ActionInfo] = {}
|
||||||
target_message: Optional[Dict[str, Any]] = None # 初始化target_message变量
|
target_message: Optional[Dict[str, Any]] = None # 初始化target_message变量
|
||||||
prompt: str = ""
|
prompt: str = ""
|
||||||
|
message_id_list: list = []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
is_group_chat = True
|
is_group_chat = True
|
||||||
@@ -181,6 +200,23 @@ class ActionPlanner:
|
|||||||
if target_message_id := parsed_json.get("target_message_id"):
|
if target_message_id := parsed_json.get("target_message_id"):
|
||||||
# 根据target_message_id查找原始消息
|
# 根据target_message_id查找原始消息
|
||||||
target_message = self.find_message_by_id(target_message_id, message_id_list)
|
target_message = self.find_message_by_id(target_message_id, message_id_list)
|
||||||
|
# target_message = None
|
||||||
|
# 如果获取的target_message为None,输出warning并重新plan
|
||||||
|
if target_message is None:
|
||||||
|
self.plan_retry_count += 1
|
||||||
|
logger.warning(f"{self.log_prefix}无法找到target_message_id '{target_message_id}' 对应的消息,重试次数: {self.plan_retry_count}/{self.max_plan_retries}")
|
||||||
|
|
||||||
|
# 如果连续三次plan均为None,输出error并选取最新消息
|
||||||
|
if self.plan_retry_count >= self.max_plan_retries:
|
||||||
|
logger.error(f"{self.log_prefix}连续{self.max_plan_retries}次plan获取target_message失败,选择最新消息作为target_message")
|
||||||
|
target_message = self.get_latest_message(message_id_list)
|
||||||
|
self.plan_retry_count = 0 # 重置计数器
|
||||||
|
else:
|
||||||
|
# 递归重新plan
|
||||||
|
return await self.plan(mode)
|
||||||
|
else:
|
||||||
|
# 成功获取到target_message,重置计数器
|
||||||
|
self.plan_retry_count = 0
|
||||||
else:
|
else:
|
||||||
logger.warning(f"{self.log_prefix}FOCUS模式下动作'{action}'缺少target_message_id")
|
logger.warning(f"{self.log_prefix}FOCUS模式下动作'{action}'缺少target_message_id")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user