From c2e8d2fa1592c6a8add83b478c2eb7143f3cf5e4 Mon Sep 17 00:00:00 2001 From: Stardust Date: Tue, 24 Mar 2026 16:13:19 +0800 Subject: [PATCH 1/3] fix(pipeline): skip waking on empty messages --- astrbot/core/pipeline/waking_check/stage.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index 2dcb840e91..75d3ade036 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -143,6 +143,10 @@ async def process( event.is_at_or_wake_command = True wake_prefix = "" + if is_wake and not event.message_str and not messages: + event.stop_event() + return + # 检查插件的 handler filter activated_handlers = [] handlers_parsed_params = {} # 注册了指令的 handler From 28b1772f4a29c0936b17d5c8ff765e799615f35b Mon Sep 17 00:00:00 2001 From: Stardust Date: Fri, 27 Mar 2026 22:02:45 +0800 Subject: [PATCH 2/3] fix(pipeline): skip empty message LLM request even with provider_request --- .../process_stage/method/agent_sub_stages/internal.py | 9 ++------- astrbot/core/pipeline/waking_check/stage.py | 4 ---- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py index c7441d09f4..9e78e45c6b 100644 --- a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +++ b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py @@ -150,18 +150,13 @@ async def process( if (enable_streaming := event.get_extra("enable_streaming")) is not None: streaming_response = bool(enable_streaming) - has_provider_request = event.get_extra("provider_request") is not None has_valid_message = bool(event.message_str and event.message_str.strip()) has_media_content = any( isinstance(comp, Image | File) for comp in event.message_obj.message ) - if ( - not has_provider_request - and not has_valid_message - and not has_media_content - ): - logger.debug("skip llm request: empty message and no provider_request") + if not has_valid_message and not has_media_content: + logger.debug("skip llm request: empty message") return logger.debug("ready to request llm provider") diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index 75d3ade036..2dcb840e91 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -143,10 +143,6 @@ async def process( event.is_at_or_wake_command = True wake_prefix = "" - if is_wake and not event.message_str and not messages: - event.stop_event() - return - # 检查插件的 handler filter activated_handlers = [] handlers_parsed_params = {} # 注册了指令的 handler From 2c5fc408273bd7d3e7afb25fb7e817a89aa5925b Mon Sep 17 00:00:00 2001 From: Stardust Date: Sat, 28 Mar 2026 11:42:06 +0800 Subject: [PATCH 3/3] fix(pipeline): skip empty messages in empty_mention_waiter --- astrbot/builtin_stars/session_controller/main.py | 2 ++ .../process_stage/method/agent_sub_stages/internal.py | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/astrbot/builtin_stars/session_controller/main.py b/astrbot/builtin_stars/session_controller/main.py index 70081e03a6..8ce28fa237 100644 --- a/astrbot/builtin_stars/session_controller/main.py +++ b/astrbot/builtin_stars/session_controller/main.py @@ -91,6 +91,8 @@ async def empty_mention_waiter( controller: SessionController, event: AstrMessageEvent, ) -> None: + if not event.message_str or not event.message_str.strip(): + return event.message_obj.message.insert( 0, Comp.At(qq=event.get_self_id(), name=event.get_self_id()), diff --git a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py index 9e78e45c6b..c7441d09f4 100644 --- a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +++ b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py @@ -150,13 +150,18 @@ async def process( if (enable_streaming := event.get_extra("enable_streaming")) is not None: streaming_response = bool(enable_streaming) + has_provider_request = event.get_extra("provider_request") is not None has_valid_message = bool(event.message_str and event.message_str.strip()) has_media_content = any( isinstance(comp, Image | File) for comp in event.message_obj.message ) - if not has_valid_message and not has_media_content: - logger.debug("skip llm request: empty message") + if ( + not has_provider_request + and not has_valid_message + and not has_media_content + ): + logger.debug("skip llm request: empty message and no provider_request") return logger.debug("ready to request llm provider")