feat(actions): 支持同时进行回复与其他动作
重构了动作执行流程,以支持更丰富的多动作组合,例如在发送文本回复的同时发送一个表情。 主要变更: - **执行流程**: 在 `CycleProcessor` 中,将动作分为“回复”和“其他”两类。系统会先串行执行回复动作,再并行执行所有其他动作,确保了核心回复的优先性。 - **规划逻辑**: 在 `Planner` 中优化了提示词,并增加后处理步骤,以鼓励并确保在回复时触发补充性动作(如100%概率的emoji)。 - **emoji动作**: 重构了表情选择逻辑,现在会评估所有可用的表情,而不仅仅是随机抽样,提高了选择的准确性。 - **修复**: 修复了 `ActionModifier` 中随机激活概率为100%的动作可能不触发的bug。
This commit is contained in:
@@ -76,6 +76,8 @@ def init_prompt():
|
||||
|
||||
{action_options_text}
|
||||
|
||||
- 如果用户明确要求使用某个动作,请优先选择该动作。
|
||||
- 当一个动作可以作为另一个动作的补充时,你应该同时选择它们。例如,在回复的同时可以发送表情包(emoji)。
|
||||
你必须从上面列出的可用action中选择一个或多个,并说明触发action的消息id(不是消息原文)和选择该action的原因。消息id格式:m+数字
|
||||
|
||||
请根据动作示例,以严格的 JSON 格式输出,返回一个包含所有选定动作的JSON列表。如果只选择一个动作,也请将其包含在列表中。如果没有任何合适的动作,返回一个空列表[]。不要输出markdown格式```json等内容,直接输出且仅包含 JSON 列表内容:
|
||||
@@ -407,6 +409,23 @@ class ActionPlanner:
|
||||
# --- 3. 后处理 ---
|
||||
final_actions = self._filter_no_actions(final_actions)
|
||||
|
||||
# === 强制后处理:确保100%概率的动作在回复时被附带 ===
|
||||
has_reply_action = any(a.get("action_type") == "reply" for a in final_actions)
|
||||
if has_reply_action:
|
||||
for action_name, action_info in available_actions.items():
|
||||
if action_info.activation_type == ActionActivationType.RANDOM and action_info.random_activation_probability >= 1.0:
|
||||
# 检查此动作是否已被选择
|
||||
is_already_chosen = any(a.get("action_type") == action_name for a in final_actions)
|
||||
if not is_already_chosen:
|
||||
logger.info(f"{self.log_prefix}强制添加100%概率动作: {action_name}")
|
||||
final_actions.append({
|
||||
"action_type": action_name,
|
||||
"reasoning": "根据100%概率设置强制添加",
|
||||
"action_data": {},
|
||||
"action_message": self.get_latest_message(used_message_id_list),
|
||||
"available_actions": available_actions,
|
||||
})
|
||||
|
||||
if not final_actions:
|
||||
final_actions = [
|
||||
{
|
||||
@@ -531,9 +550,13 @@ class ActionPlanner:
|
||||
|
||||
if mode == ChatMode.FOCUS:
|
||||
no_action_block = """
|
||||
- 'no_reply' 表示不进行回复,等待合适的回复时机
|
||||
- 当你刚刚发送了消息,没有人回复时,选择no_reply
|
||||
- 当你一次发送了太多消息,为了避免打扰聊天节奏,选择no_reply
|
||||
动作:no_action
|
||||
动作描述:不选择任何动作
|
||||
{{
|
||||
"action": "no_action",
|
||||
"reason":"不动作的原因"
|
||||
}}
|
||||
|
||||
动作:no_reply
|
||||
动作描述:不进行回复,等待合适的回复时机
|
||||
- 当你刚刚发送了消息,没有人回复时,选择no_reply
|
||||
|
||||
Reference in New Issue
Block a user