From 9146046e0fca74297f7943cb5161abce95d856bb Mon Sep 17 00:00:00 2001 From: Takuya Ono Date: Sun, 8 Jun 2025 16:19:03 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix(Gemini=20LLM):=20Support=20G?= =?UTF-8?q?emini=200.2.x=20plugin=20on=20agent=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In `base_app_runner.py` and `easy_ui_based_generate_task_pipeline.py`, modified to handle cases where `delta.message.content` is not only a string but also a list containing objects like `TextPromptMessageContent`. This allows supporting diverse LLM output formats. The previous code assumed that LLM responses would always be a single string. However, multimodal models or models generating more complex responses might return content as a list of objects, such as `TextPromptMessageContent`. This change allows the application to correctly process and display these new forms of responses to the user. This enhances support for future LLM feature extensions. fixes #20204 --- api/core/app/apps/base_app_runner.py | 9 ++++++++- .../easy_ui_based_generate_task_pipeline.py | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/api/core/app/apps/base_app_runner.py b/api/core/app/apps/base_app_runner.py index c813dbb9d1..261f7d295f 100644 --- a/api/core/app/apps/base_app_runner.py +++ b/api/core/app/apps/base_app_runner.py @@ -317,7 +317,14 @@ class AppRunner: else: queue_manager.publish(QueueAgentMessageEvent(chunk=result), PublishFrom.APPLICATION_MANAGER) - text += result.delta.message.content + if isinstance(result.delta.message.content, str): + text += result.delta.message.content + elif isinstance(result.delta.message.content, list): + for content in result.delta.message.content: + if not isinstance(content, str): + text += content.data + else: + text += str(content) # failback to str if not model: model = result.model diff --git a/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py b/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py index 1ea50a5778..d535e1f835 100644 --- a/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py +++ b/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py @@ -48,6 +48,7 @@ from core.model_manager import ModelInstance from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage from core.model_runtime.entities.message_entities import ( AssistantPromptMessage, + TextPromptMessageContent, ) from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel from core.ops.entities.trace_entity import TraceTaskName @@ -309,6 +310,23 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline): delta_text = chunk.delta.message.content if delta_text is None: continue + if isinstance(chunk.delta.message.content, list): + delta_text = "" + for content in chunk.delta.message.content: + logger.debug( + "The content type %s in LLM chunk delta message content.: %r", type(content), content + ) + if isinstance(content, TextPromptMessageContent): + delta_text += content.data + elif isinstance(content, str): + delta_text += content # failback to str + else: + logger.warning( + "Unsupported content type %s in LLM chunk delta message content.: %r", + type(content), + content, + ) + continue if not self._task_state.llm_result.prompt_messages: self._task_state.llm_result.prompt_messages = chunk.prompt_messages