From 3091b92158077c4fd473e05bc672d47cb00ad30a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:14:25 +0000 Subject: [PATCH] feat: restore original UMO in respond stage and update send_message_to_user tool Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com> --- astrbot/core/astr_main_agent_resources.py | 9 ++++++++- astrbot/core/pipeline/respond/stage.py | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/astrbot/core/astr_main_agent_resources.py b/astrbot/core/astr_main_agent_resources.py index 1d5c085ce..c6f8fbd2b 100644 --- a/astrbot/core/astr_main_agent_resources.py +++ b/astrbot/core/astr_main_agent_resources.py @@ -212,6 +212,10 @@ class SendMessageToUserTool(FunctionTool[AstrAgentContext]): "required": ["type"], }, }, + "session": { + "type": "string", + "description": "Target session ID in format 'platform:type:session_id'. If not specified, sends to the current session.", + }, }, "required": ["messages"], } @@ -253,7 +257,10 @@ class SendMessageToUserTool(FunctionTool[AstrAgentContext]): async def call( self, context: ContextWrapper[AstrAgentContext], **kwargs ) -> ToolExecResult: - session = kwargs.get("session") or context.context.event.unified_msg_origin + # In global context mode, default to original UMO if session not specified + original_umo = context.context.event.get_extra("original_umo") + default_session = original_umo or context.context.event.unified_msg_origin + session = kwargs.get("session") or default_session messages = kwargs.get("messages") if not isinstance(messages, list) or not messages: diff --git a/astrbot/core/pipeline/respond/stage.py b/astrbot/core/pipeline/respond/stage.py index 60ab168b3..573d2fa14 100644 --- a/astrbot/core/pipeline/respond/stage.py +++ b/astrbot/core/pipeline/respond/stage.py @@ -169,6 +169,14 @@ class RespondStage(Stage): f"Prepare to send - {event.get_sender_name()}/{event.get_sender_id()}: {event._outline_chain(result.chain)}", ) + # Restore original UMO before sending if in global context mode + original_umo = event.get_extra("original_umo") + if original_umo: + logger.debug( + f"Restoring original UMO before sending: {event.unified_msg_origin} -> {original_umo}" + ) + event.unified_msg_origin = original_umo + if result.result_content_type == ResultContentType.STREAMING_RESULT: if result.async_stream is None: logger.warning("async_stream 为空,跳过发送。")