From 2f3a3f354f10687ddfc39971ef313bb337a81f27 Mon Sep 17 00:00:00 2001 From: Gao Jinzhe <2968474907@qq.com> Date: Sun, 11 Jan 2026 15:11:35 +0800 Subject: [PATCH] fix: add image placeholder for non-vision models to fix no response in private chat (#4411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复私聊中单独发送图片无响应的问题,为非视觉模型添加图片占位符 * ruffcheck * 修复占位符被重复添加的问题 * 简化逻辑 --- .../method/agent_sub_stages/internal.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 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 474b40e34..cb8bcf5aa 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 @@ -191,7 +191,16 @@ class InternalAgentSubStage(Stage): if req.image_urls: provider_cfg = provider.provider_config.get("modalities", ["image"]) if "image" not in provider_cfg: - logger.debug(f"用户设置提供商 {provider} 不支持图像,清空图像列表。") + logger.debug( + f"用户设置提供商 {provider} 不支持图像,将图像替换为占位符。" + ) + # 为每个图片添加占位符到 prompt + image_count = len(req.image_urls) + placeholder = " ".join(["[图片]"] * image_count) + if req.prompt: + req.prompt = f"{placeholder} {req.prompt}" + else: + req.prompt = placeholder req.image_urls = [] if req.func_tool: provider_cfg = provider.provider_config.get("modalities", ["tool_use"]) @@ -364,8 +373,16 @@ class InternalAgentSubStage(Stage): # 检查消息内容是否有效,避免空消息触发钩子 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: + 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