feat(plan_filter): 优化动作过滤逻辑,增强对reply和respond动作的可用性检查

This commit is contained in:
Windpicker-owo
2025-11-13 12:51:58 +08:00
parent 10f5b7d037
commit 1d92f16ce2

View File

@@ -73,31 +73,31 @@ class ChatterPlanFilter:
"actions": {"action_type": "no_action", "reason": "返回内容无法解析为JSON"}, "actions": {"action_type": "no_action", "reason": "返回内容无法解析为JSON"},
} }
if "reply" in plan.available_actions and reply_not_available: # 检查reply和respond动作是否真正可用
# 如果reply动作不可用但llm返回的仍然有reply则改为no_reply reply_action_available = False
if isinstance(parsed_json, dict): respond_action_available = False
actions_obj = parsed_json.get("actions", {})
# actions 可能是字典或列表 # 检查reply动作
if isinstance(actions_obj, dict) and actions_obj.get("action_type", "") == "reply": if "reply" in plan.available_actions:
parsed_json["actions"]["action_type"] = "no_reply" reply_action_info = plan.available_actions.get("reply")
elif isinstance(actions_obj, list): if reply_action_info and hasattr(reply_action_info, 'enabled') and reply_action_info.enabled:
for action_item in actions_obj: reply_action_available = True
if isinstance(action_item, dict) and action_item.get("action_type", "") == "reply":
action_item["action_type"] = "no_reply" # 检查respond动作
if "reason" in action_item: if "respond" in plan.available_actions:
action_item["reason"] += " (但由于兴趣度不足reply动作不可用已改为no_reply)" respond_action_info = plan.available_actions.get("respond")
elif isinstance(parsed_json, list): if respond_action_info and hasattr(respond_action_info, 'enabled') and respond_action_info.enabled:
for item in parsed_json: respond_action_available = True
if isinstance(item, dict):
actions_obj = item.get("actions", {}) # 如果reply/respond动作真正存在但兴趣度不足reply_not_available=True则将它们改为no_reply/no_action
if isinstance(actions_obj, dict) and actions_obj.get("action_type", "") == "reply": if reply_not_available:
item["actions"]["action_type"] = "no_reply" # 如果reply动作可用但兴趣度不足则将reply改为no_reply
elif isinstance(actions_obj, list): if reply_action_available:
for action_item in actions_obj: self._filter_action_in_json(parsed_json, "reply", "no_reply", "但由于兴趣度不足reply动作不可用已改为no_reply")
if isinstance(action_item, dict) and action_item.get("action_type", "") == "reply":
action_item["action_type"] = "no_reply" # 如果respond动作可用但兴趣度不足则将respond改为no_action
if "reason" in action_item: if respond_action_available:
action_item["reason"] += " (但由于兴趣度不足reply动作不可用已改为no_reply)" self._filter_action_in_json(parsed_json, "respond", "no_action", "但由于兴趣度不足respond动作不可用已改为no_action")
if isinstance(parsed_json, dict): if isinstance(parsed_json, dict):
parsed_json = [parsed_json] parsed_json = [parsed_json]
@@ -655,6 +655,7 @@ class ChatterPlanFilter:
# 获取该动作定义的合法参数 # 获取该动作定义的合法参数
defined_params = set(action_info.action_parameters.keys()) defined_params = set(action_info.action_parameters.keys())
defined_params.add("thinking") # 保留thinking字段
# 合法参数集合 # 合法参数集合
valid_params = defined_params valid_params = defined_params
@@ -930,3 +931,37 @@ class ChatterPlanFilter:
): ):
return message return message
return None return None
def _filter_action_in_json(self, parsed_json: dict | list, action_name: str, target_action: str, reason_suffix: str) -> None:
"""
在解析后的JSON中过滤指定的动作类型
Args:
parsed_json: 解析后的JSON可能是dict或list
action_name: 要过滤的动作名称(如"reply", "respond"
target_action: 替换的目标动作(如"no_reply", "no_action"
reason_suffix: 添加到reason中的后缀说明
"""
if isinstance(parsed_json, dict):
actions_obj = parsed_json.get("actions", {})
# actions 可能是字典或列表
if isinstance(actions_obj, dict) and actions_obj.get("action_type", "") == action_name:
actions_obj["action_type"] = target_action
elif isinstance(actions_obj, list):
for action_item in actions_obj:
if isinstance(action_item, dict) and action_item.get("action_type", "") == action_name:
action_item["action_type"] = target_action
if "reason" in action_item:
action_item["reason"] += f" ({reason_suffix})"
elif isinstance(parsed_json, list):
for item in parsed_json:
if isinstance(item, dict):
actions_obj = item.get("actions", {})
if isinstance(actions_obj, dict) and actions_obj.get("action_type", "") == action_name:
actions_obj["action_type"] = target_action
elif isinstance(actions_obj, list):
for action_item in actions_obj:
if isinstance(action_item, dict) and action_item.get("action_type", "") == action_name:
action_item["action_type"] = target_action
if "reason" in action_item:
action_item["reason"] += f" ({reason_suffix})"