diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index 5271162e0..a1cb36e9e 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -40,6 +40,7 @@ DEFAULT_CONFIG = { }, "no_permission_reply": True, "empty_mention_waiting": True, + "empty_mention_waiting_need_reply": True, "friend_message_needs_wake_prefix": False, "ignore_bot_self_message": False, }, @@ -357,9 +358,14 @@ CONFIG_METADATA_2 = { "hint": "启用后,当用户没有权限执行某个操作时,机器人会回复一条消息。", }, "empty_mention_waiting": { - "description": "只 @ 机器人是否触发等待回复", + "description": "只 @ 机器人是否触发等待", "type": "bool", - "hint": "启用后,当消息内容只有 @ 机器人时,会触发等待回复,在 60 秒内的该用户的任意一条消息均会唤醒机器人。这在某些平台不支持 @ 和语音/图片等消息同时发送时特别有用。", + "hint": "启用后,当消息内容只有 @ 机器人时,会触发等待,在 60 秒内的该用户的任意一条消息均会唤醒机器人。这在某些平台不支持 @ 和语音/图片等消息同时发送时特别有用。", + }, + "empty_mention_waiting_need_reply": { + "description": "只 @ 机器人触发等待时是否需要回复提醒", + "type": "bool", + "hint": "在上面一个配置项中,如果启用了触发等待,启用此项后,机器人会使用 LLM 生成一条回复。否则,将不回复而只是等待。", }, "friend_message_needs_wake_prefix": { "description": "私聊消息是否需要唤醒前缀", diff --git a/packages/session_controller/main.py b/packages/session_controller/main.py index d639dcaac..a34635228 100644 --- a/packages/session_controller/main.py +++ b/packages/session_controller/main.py @@ -26,9 +26,7 @@ class Waiter(Star): def __init__(self, context: Context): super().__init__(context) - self.empty_mention_waiting = self.context.get_config()["platform_settings"][ - "empty_mention_waiting" - ] + self.p_settings: dict = self.context.get_config()["platform_settings"] self.wake_prefix = self.context.get_config()["wake_prefix"] @filter.event_message_type(filter.EventMessageType.ALL, priority=maxsize) @@ -49,44 +47,49 @@ class Waiter(Star): if ( isinstance(messages[0], Comp.At) and str(messages[0].qq) == str(event.get_self_id()) - and self.empty_mention_waiting + and self.p_settings.get("empty_mention_waiting", True) ) or ( isinstance(messages[0], Comp.Plain) and messages[0].text.strip() in self.wake_prefix ): - try: - # 尝试使用 LLM 生成更生动的回复 - func_tools_mgr = self.context.get_llm_tool_manager() + if self.p_settings.get("empty_mention_waiting_need_reply", True): + try: + # 尝试使用 LLM 生成更生动的回复 + func_tools_mgr = self.context.get_llm_tool_manager() - # 获取用户当前的对话信息 - curr_cid = await self.context.conversation_manager.get_curr_conversation_id( - event.unified_msg_origin - ) - conversation = None - - if curr_cid: - conversation = await self.context.conversation_manager.get_conversation( - event.unified_msg_origin, curr_cid - ) - else: - # 创建新对话 - curr_cid = await self.context.conversation_manager.new_conversation( + # 获取用户当前的对话信息 + curr_cid = await self.context.conversation_manager.get_curr_conversation_id( event.unified_msg_origin ) + conversation = None - # 使用 LLM 生成回复 - yield event.request_llm( - prompt="注意,你正在社交媒体上中与用户进行聊天,用户只是通过@来唤醒你,但并未在这条消息中输入内容,他可能会在接下来一条发送他想发送的内容。请你友好地询问用户想要聊些什么或者需要什么帮助,回复要符合人设,不要太过机械化。注意,你仅需要输出要回复用户的内容,不要输出其他任何东西", - func_tool_manager=func_tools_mgr, - session_id=curr_cid, - contexts=[], - system_prompt="", - conversation=conversation, - ) - except Exception as e: - logger.error(f"LLM response failed: {str(e)}") - # LLM 回复失败,使用原始预设回复 - yield event.plain_result("想要问什么呢?😄") + if curr_cid: + conversation = await self.context.conversation_manager.get_conversation( + event.unified_msg_origin, curr_cid + ) + else: + # 创建新对话 + curr_cid = await self.context.conversation_manager.new_conversation( + event.unified_msg_origin + ) + + # 使用 LLM 生成回复 + yield event.request_llm( + prompt=( + "注意,你正在社交媒体上中与用户进行聊天,用户只是通过@来唤醒你,但并未在这条消息中输入内容,他可能会在接下来一条发送他想发送的内容。" + "你友好地询问用户想要聊些什么或者需要什么帮助,回复要符合人设,不要太过机械化。" + "请注意,你仅需要输出要回复用户的内容,不要输出其他任何东西" + ), + func_tool_manager=func_tools_mgr, + session_id=curr_cid, + contexts=[], + system_prompt="", + conversation=conversation, + ) + except Exception as e: + logger.error(f"LLM response failed: {str(e)}") + # LLM 回复失败,使用原始预设回复 + yield event.plain_result("想要问什么呢?😄") @session_waiter(60) async def empty_mention_waiter(