🐛 Fix(Gemini LLM): Support Gemini 0.2.x plugin on agent app (#20794)
Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import time
|
import time
|
||||||
from collections.abc import Generator, Mapping, Sequence
|
from collections.abc import Generator, Mapping, Sequence
|
||||||
from typing import TYPE_CHECKING, Any, Optional, Union
|
from typing import TYPE_CHECKING, Any, Optional, Union
|
||||||
@@ -33,6 +34,8 @@ from models.model import App, AppMode, Message, MessageAnnotation
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.file.models import File
|
from core.file.models import File
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class AppRunner:
|
class AppRunner:
|
||||||
def get_pre_calculate_rest_tokens(
|
def get_pre_calculate_rest_tokens(
|
||||||
@@ -298,7 +301,7 @@ class AppRunner:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _handle_invoke_result_stream(
|
def _handle_invoke_result_stream(
|
||||||
self, invoke_result: Generator, queue_manager: AppQueueManager, agent: bool
|
self, invoke_result: Generator[LLMResultChunk, None, None], queue_manager: AppQueueManager, agent: bool
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Handle invoke result
|
Handle invoke result
|
||||||
@@ -317,18 +320,28 @@ class AppRunner:
|
|||||||
else:
|
else:
|
||||||
queue_manager.publish(QueueAgentMessageEvent(chunk=result), PublishFrom.APPLICATION_MANAGER)
|
queue_manager.publish(QueueAgentMessageEvent(chunk=result), PublishFrom.APPLICATION_MANAGER)
|
||||||
|
|
||||||
text += result.delta.message.content
|
message = result.delta.message
|
||||||
|
if isinstance(message.content, str):
|
||||||
|
text += message.content
|
||||||
|
elif isinstance(message.content, list):
|
||||||
|
for content in message.content:
|
||||||
|
if not isinstance(content, str):
|
||||||
|
# TODO(QuantumGhost): Add multimodal output support for easy ui.
|
||||||
|
_logger.warning("received multimodal output, type=%s", type(content))
|
||||||
|
text += content.data
|
||||||
|
else:
|
||||||
|
text += content # failback to str
|
||||||
|
|
||||||
if not model:
|
if not model:
|
||||||
model = result.model
|
model = result.model
|
||||||
|
|
||||||
if not prompt_messages:
|
if not prompt_messages:
|
||||||
prompt_messages = result.prompt_messages
|
prompt_messages = list(result.prompt_messages)
|
||||||
|
|
||||||
if result.delta.usage:
|
if result.delta.usage:
|
||||||
usage = result.delta.usage
|
usage = result.delta.usage
|
||||||
|
|
||||||
if not usage:
|
if usage is None:
|
||||||
usage = LLMUsage.empty_usage()
|
usage = LLMUsage.empty_usage()
|
||||||
|
|
||||||
llm_result = LLMResult(
|
llm_result = LLMResult(
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user