🐛 Fix(Gemini LLM): Support Gemini 0.2.x plugin on agent app

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
pull/20794/head
Takuya Ono 12 months ago
parent 65c7c01d90
commit 9146046e0f
No known key found for this signature in database
GPG Key ID: C46156B73465B8AD

@ -317,7 +317,14 @@ class AppRunner:
else: else:
queue_manager.publish(QueueAgentMessageEvent(chunk=result), PublishFrom.APPLICATION_MANAGER) queue_manager.publish(QueueAgentMessageEvent(chunk=result), PublishFrom.APPLICATION_MANAGER)
if isinstance(result.delta.message.content, str):
text += result.delta.message.content 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: if not model:
model = result.model model = result.model

@ -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.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage
from core.model_runtime.entities.message_entities import ( from core.model_runtime.entities.message_entities import (
AssistantPromptMessage, AssistantPromptMessage,
TextPromptMessageContent,
) )
from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel
from core.ops.entities.trace_entity import TraceTaskName from core.ops.entities.trace_entity import TraceTaskName
@ -309,6 +310,23 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline):
delta_text = chunk.delta.message.content delta_text = chunk.delta.message.content
if delta_text is None: if delta_text is None:
continue 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: if not self._task_state.llm_result.prompt_messages:
self._task_state.llm_result.prompt_messages = chunk.prompt_messages self._task_state.llm_result.prompt_messages = chunk.prompt_messages

Loading…
Cancel
Save