|
|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
import json
|
|
|
|
|
import logging
|
|
|
|
|
import time
|
|
|
|
|
from collections.abc import Generator
|
|
|
|
|
@ -43,7 +42,7 @@ from core.app.entities.task_entities import (
|
|
|
|
|
StreamResponse,
|
|
|
|
|
)
|
|
|
|
|
from core.app.task_pipeline.based_generate_task_pipeline import BasedGenerateTaskPipeline
|
|
|
|
|
from core.app.task_pipeline.message_cycle_manage import MessageCycleManage
|
|
|
|
|
from core.app.task_pipeline.message_cycle_manager import MessageCycleManager
|
|
|
|
|
from core.base.tts import AppGeneratorTTSPublisher, AudioTrunk
|
|
|
|
|
from core.model_manager import ModelInstance
|
|
|
|
|
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage
|
|
|
|
|
@ -51,7 +50,6 @@ from core.model_runtime.entities.message_entities import (
|
|
|
|
|
AssistantPromptMessage,
|
|
|
|
|
)
|
|
|
|
|
from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel
|
|
|
|
|
from core.model_runtime.utils.encoders import jsonable_encoder
|
|
|
|
|
from core.ops.entities.trace_entity import TraceTaskName
|
|
|
|
|
from core.ops.ops_trace_manager import TraceQueueManager, TraceTask
|
|
|
|
|
from core.prompt.utils.prompt_message_util import PromptMessageUtil
|
|
|
|
|
@ -63,7 +61,7 @@ from models.model import AppMode, Conversation, Message, MessageAgentThought
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleManage):
|
|
|
|
|
class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline):
|
|
|
|
|
"""
|
|
|
|
|
EasyUIBasedGenerateTaskPipeline is a class that generate stream output and state management for Application.
|
|
|
|
|
"""
|
|
|
|
|
@ -104,6 +102,11 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._message_cycle_manager = MessageCycleManager(
|
|
|
|
|
application_generate_entity=application_generate_entity,
|
|
|
|
|
task_state=self._task_state,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._conversation_name_generate_thread: Optional[Thread] = None
|
|
|
|
|
|
|
|
|
|
def process(
|
|
|
|
|
@ -115,7 +118,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
]:
|
|
|
|
|
if self._application_generate_entity.app_config.app_mode != AppMode.COMPLETION:
|
|
|
|
|
# start generate conversation name thread
|
|
|
|
|
self._conversation_name_generate_thread = self._generate_conversation_name(
|
|
|
|
|
self._conversation_name_generate_thread = self._message_cycle_manager.generate_conversation_name(
|
|
|
|
|
conversation_id=self._conversation_id, query=self._application_generate_entity.query or ""
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@ -136,9 +139,9 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
if isinstance(stream_response, ErrorStreamResponse):
|
|
|
|
|
raise stream_response.err
|
|
|
|
|
elif isinstance(stream_response, MessageEndStreamResponse):
|
|
|
|
|
extras = {"usage": jsonable_encoder(self._task_state.llm_result.usage)}
|
|
|
|
|
extras = {"usage": self._task_state.llm_result.usage.model_dump()}
|
|
|
|
|
if self._task_state.metadata:
|
|
|
|
|
extras["metadata"] = self._task_state.metadata
|
|
|
|
|
extras["metadata"] = self._task_state.metadata.model_dump()
|
|
|
|
|
response: Union[ChatbotAppBlockingResponse, CompletionAppBlockingResponse]
|
|
|
|
|
if self._conversation_mode == AppMode.COMPLETION.value:
|
|
|
|
|
response = CompletionAppBlockingResponse(
|
|
|
|
|
@ -277,7 +280,9 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
)
|
|
|
|
|
if output_moderation_answer:
|
|
|
|
|
self._task_state.llm_result.message.content = output_moderation_answer
|
|
|
|
|
yield self._message_replace_to_stream_response(answer=output_moderation_answer)
|
|
|
|
|
yield self._message_cycle_manager.message_replace_to_stream_response(
|
|
|
|
|
answer=output_moderation_answer
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
# Save message
|
|
|
|
|
@ -286,9 +291,9 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
message_end_resp = self._message_end_to_stream_response()
|
|
|
|
|
yield message_end_resp
|
|
|
|
|
elif isinstance(event, QueueRetrieverResourcesEvent):
|
|
|
|
|
self._handle_retriever_resources(event)
|
|
|
|
|
self._message_cycle_manager.handle_retriever_resources(event)
|
|
|
|
|
elif isinstance(event, QueueAnnotationReplyEvent):
|
|
|
|
|
annotation = self._handle_annotation_reply(event)
|
|
|
|
|
annotation = self._message_cycle_manager.handle_annotation_reply(event)
|
|
|
|
|
if annotation:
|
|
|
|
|
self._task_state.llm_result.message.content = annotation.content
|
|
|
|
|
elif isinstance(event, QueueAgentThoughtEvent):
|
|
|
|
|
@ -296,7 +301,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
if agent_thought_response is not None:
|
|
|
|
|
yield agent_thought_response
|
|
|
|
|
elif isinstance(event, QueueMessageFileEvent):
|
|
|
|
|
response = self._message_file_to_stream_response(event)
|
|
|
|
|
response = self._message_cycle_manager.message_file_to_stream_response(event)
|
|
|
|
|
if response:
|
|
|
|
|
yield response
|
|
|
|
|
elif isinstance(event, QueueLLMChunkEvent | QueueAgentMessageEvent):
|
|
|
|
|
@ -318,7 +323,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
self._task_state.llm_result.message.content = current_content
|
|
|
|
|
|
|
|
|
|
if isinstance(event, QueueLLMChunkEvent):
|
|
|
|
|
yield self._message_to_stream_response(
|
|
|
|
|
yield self._message_cycle_manager.message_to_stream_response(
|
|
|
|
|
answer=cast(str, delta_text),
|
|
|
|
|
message_id=self._message_id,
|
|
|
|
|
)
|
|
|
|
|
@ -328,7 +333,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
message_id=self._message_id,
|
|
|
|
|
)
|
|
|
|
|
elif isinstance(event, QueueMessageReplaceEvent):
|
|
|
|
|
yield self._message_replace_to_stream_response(answer=event.text)
|
|
|
|
|
yield self._message_cycle_manager.message_replace_to_stream_response(answer=event.text)
|
|
|
|
|
elif isinstance(event, QueuePingEvent):
|
|
|
|
|
yield self._ping_stream_response()
|
|
|
|
|
else:
|
|
|
|
|
@ -372,9 +377,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
message.provider_response_latency = time.perf_counter() - self._start_at
|
|
|
|
|
message.total_price = usage.total_price
|
|
|
|
|
message.currency = usage.currency
|
|
|
|
|
message.message_metadata = (
|
|
|
|
|
json.dumps(jsonable_encoder(self._task_state.metadata)) if self._task_state.metadata else None
|
|
|
|
|
)
|
|
|
|
|
message.message_metadata = self._task_state.metadata.model_dump_json()
|
|
|
|
|
|
|
|
|
|
if trace_manager:
|
|
|
|
|
trace_manager.add_trace_task(
|
|
|
|
|
@ -423,16 +426,12 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline, MessageCycleMan
|
|
|
|
|
Message end to stream response.
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
self._task_state.metadata["usage"] = jsonable_encoder(self._task_state.llm_result.usage)
|
|
|
|
|
|
|
|
|
|
extras = {}
|
|
|
|
|
if self._task_state.metadata:
|
|
|
|
|
extras["metadata"] = self._task_state.metadata
|
|
|
|
|
|
|
|
|
|
self._task_state.metadata.usage = self._task_state.llm_result.usage
|
|
|
|
|
metadata_dict = self._task_state.metadata.model_dump()
|
|
|
|
|
return MessageEndStreamResponse(
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
id=self._message_id,
|
|
|
|
|
metadata=extras.get("metadata", {}),
|
|
|
|
|
metadata=metadata_dict,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def _agent_message_to_stream_response(self, answer: str, message_id: str) -> AgentMessageStreamResponse:
|
|
|
|
|
|