|
|
|
|
@ -68,24 +68,17 @@ from models.account import Account
|
|
|
|
|
from models.enums import CreatedByRole
|
|
|
|
|
from models.workflow import (
|
|
|
|
|
Workflow,
|
|
|
|
|
WorkflowNodeExecution,
|
|
|
|
|
WorkflowRunStatus,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCycleManage, MessageCycleManage):
|
|
|
|
|
class AdvancedChatAppGenerateTaskPipeline:
|
|
|
|
|
"""
|
|
|
|
|
AdvancedChatAppGenerateTaskPipeline is a class that generate stream output and state management for Application.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
_task_state: WorkflowTaskState
|
|
|
|
|
_application_generate_entity: AdvancedChatAppGenerateEntity
|
|
|
|
|
_workflow_system_variables: dict[SystemVariableKey, Any]
|
|
|
|
|
_wip_workflow_node_executions: dict[str, WorkflowNodeExecution]
|
|
|
|
|
_conversation_name_generate_thread: Optional[Thread] = None
|
|
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
|
self,
|
|
|
|
|
application_generate_entity: AdvancedChatAppGenerateEntity,
|
|
|
|
|
@ -97,7 +90,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
stream: bool,
|
|
|
|
|
dialogue_count: int,
|
|
|
|
|
) -> None:
|
|
|
|
|
super().__init__(
|
|
|
|
|
self._base_task_pipeline = BasedGenerateTaskPipeline(
|
|
|
|
|
application_generate_entity=application_generate_entity,
|
|
|
|
|
queue_manager=queue_manager,
|
|
|
|
|
stream=stream,
|
|
|
|
|
@ -114,33 +107,35 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
else:
|
|
|
|
|
raise NotImplementedError(f"User type not supported: {type(user)}")
|
|
|
|
|
|
|
|
|
|
self._workflow_cycle_manager = WorkflowCycleManage(
|
|
|
|
|
application_generate_entity=application_generate_entity,
|
|
|
|
|
workflow_system_variables={
|
|
|
|
|
SystemVariableKey.QUERY: message.query,
|
|
|
|
|
SystemVariableKey.FILES: application_generate_entity.files,
|
|
|
|
|
SystemVariableKey.CONVERSATION_ID: conversation.id,
|
|
|
|
|
SystemVariableKey.USER_ID: user_session_id,
|
|
|
|
|
SystemVariableKey.DIALOGUE_COUNT: dialogue_count,
|
|
|
|
|
SystemVariableKey.APP_ID: application_generate_entity.app_config.app_id,
|
|
|
|
|
SystemVariableKey.WORKFLOW_ID: workflow.id,
|
|
|
|
|
SystemVariableKey.WORKFLOW_RUN_ID: application_generate_entity.workflow_run_id,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._task_state = WorkflowTaskState()
|
|
|
|
|
self._message_cycle_manager = MessageCycleManage(
|
|
|
|
|
application_generate_entity=application_generate_entity, task_state=self._task_state
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._application_generate_entity = application_generate_entity
|
|
|
|
|
self._workflow_id = workflow.id
|
|
|
|
|
self._workflow_features_dict = workflow.features_dict
|
|
|
|
|
|
|
|
|
|
self._conversation_id = conversation.id
|
|
|
|
|
self._conversation_mode = conversation.mode
|
|
|
|
|
|
|
|
|
|
self._message_id = message.id
|
|
|
|
|
self._message_created_at = int(message.created_at.timestamp())
|
|
|
|
|
|
|
|
|
|
self._workflow_system_variables = {
|
|
|
|
|
SystemVariableKey.QUERY: message.query,
|
|
|
|
|
SystemVariableKey.FILES: application_generate_entity.files,
|
|
|
|
|
SystemVariableKey.CONVERSATION_ID: conversation.id,
|
|
|
|
|
SystemVariableKey.USER_ID: user_session_id,
|
|
|
|
|
SystemVariableKey.DIALOGUE_COUNT: dialogue_count,
|
|
|
|
|
SystemVariableKey.APP_ID: application_generate_entity.app_config.app_id,
|
|
|
|
|
SystemVariableKey.WORKFLOW_ID: workflow.id,
|
|
|
|
|
SystemVariableKey.WORKFLOW_RUN_ID: application_generate_entity.workflow_run_id,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self._task_state = WorkflowTaskState()
|
|
|
|
|
self._wip_workflow_node_executions = {}
|
|
|
|
|
self._wip_workflow_agent_logs = {}
|
|
|
|
|
|
|
|
|
|
self._conversation_name_generate_thread = None
|
|
|
|
|
self._conversation_name_generate_thread: Thread | None = None
|
|
|
|
|
self._recorded_files: list[Mapping[str, Any]] = []
|
|
|
|
|
self._workflow_run_id = ""
|
|
|
|
|
self._workflow_run_id: str = ""
|
|
|
|
|
|
|
|
|
|
def process(self) -> Union[ChatbotAppBlockingResponse, Generator[ChatbotAppStreamResponse, None, None]]:
|
|
|
|
|
"""
|
|
|
|
|
@ -148,13 +143,13 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
# 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
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
generator = self._wrapper_process_stream_response(trace_manager=self._application_generate_entity.trace_manager)
|
|
|
|
|
|
|
|
|
|
if self._stream:
|
|
|
|
|
if self._base_task_pipeline._stream:
|
|
|
|
|
return self._to_stream_response(generator)
|
|
|
|
|
else:
|
|
|
|
|
return self._to_blocking_response(generator)
|
|
|
|
|
@ -273,24 +268,26 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
# init fake graph runtime state
|
|
|
|
|
graph_runtime_state: Optional[GraphRuntimeState] = None
|
|
|
|
|
|
|
|
|
|
for queue_message in self._queue_manager.listen():
|
|
|
|
|
for queue_message in self._base_task_pipeline._queue_manager.listen():
|
|
|
|
|
event = queue_message.event
|
|
|
|
|
|
|
|
|
|
if isinstance(event, QueuePingEvent):
|
|
|
|
|
yield self._ping_stream_response()
|
|
|
|
|
yield self._base_task_pipeline._ping_stream_response()
|
|
|
|
|
elif isinstance(event, QueueErrorEvent):
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
err = self._handle_error(event=event, session=session, message_id=self._message_id)
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
err = self._base_task_pipeline._handle_error(
|
|
|
|
|
event=event, session=session, message_id=self._message_id
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
yield self._error_to_stream_response(err)
|
|
|
|
|
yield self._base_task_pipeline._error_to_stream_response(err)
|
|
|
|
|
break
|
|
|
|
|
elif isinstance(event, QueueWorkflowStartedEvent):
|
|
|
|
|
# override graph runtime state
|
|
|
|
|
graph_runtime_state = event.graph_runtime_state
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
# init workflow run
|
|
|
|
|
workflow_run = self._handle_workflow_run_start(
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._handle_workflow_run_start(
|
|
|
|
|
session=session,
|
|
|
|
|
workflow_id=self._workflow_id,
|
|
|
|
|
user_id=self._user_id,
|
|
|
|
|
@ -301,7 +298,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not message:
|
|
|
|
|
raise ValueError(f"Message not found: {self._message_id}")
|
|
|
|
|
message.workflow_run_id = workflow_run.id
|
|
|
|
|
workflow_start_resp = self._workflow_start_to_stream_response(
|
|
|
|
|
workflow_start_resp = self._workflow_cycle_manager._workflow_start_to_stream_response(
|
|
|
|
|
session=session, task_id=self._application_generate_entity.task_id, workflow_run=workflow_run
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
@ -314,12 +311,14 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
workflow_node_execution = self._handle_workflow_node_execution_retried(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
workflow_node_execution = self._workflow_cycle_manager._handle_workflow_node_execution_retried(
|
|
|
|
|
session=session, workflow_run=workflow_run, event=event
|
|
|
|
|
)
|
|
|
|
|
node_retry_resp = self._workflow_node_retry_to_stream_response(
|
|
|
|
|
node_retry_resp = self._workflow_cycle_manager._workflow_node_retry_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
event=event,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
@ -333,13 +332,15 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
workflow_node_execution = self._handle_node_execution_start(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
workflow_node_execution = self._workflow_cycle_manager._handle_node_execution_start(
|
|
|
|
|
session=session, workflow_run=workflow_run, event=event
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
node_start_resp = self._workflow_node_start_to_stream_response(
|
|
|
|
|
node_start_resp = self._workflow_cycle_manager._workflow_node_start_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
event=event,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
@ -352,12 +353,16 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
elif isinstance(event, QueueNodeSucceededEvent):
|
|
|
|
|
# Record files if it's an answer node or end node
|
|
|
|
|
if event.node_type in [NodeType.ANSWER, NodeType.END]:
|
|
|
|
|
self._recorded_files.extend(self._fetch_files_from_node_outputs(event.outputs or {}))
|
|
|
|
|
self._recorded_files.extend(
|
|
|
|
|
self._workflow_cycle_manager._fetch_files_from_node_outputs(event.outputs or {})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_node_execution = self._handle_workflow_node_execution_success(session=session, event=event)
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_node_execution = self._workflow_cycle_manager._handle_workflow_node_execution_success(
|
|
|
|
|
session=session, event=event
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
node_finish_resp = self._workflow_node_finish_to_stream_response(
|
|
|
|
|
node_finish_resp = self._workflow_cycle_manager._workflow_node_finish_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
event=event,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
@ -368,32 +373,35 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if node_finish_resp:
|
|
|
|
|
yield node_finish_resp
|
|
|
|
|
elif isinstance(event, QueueNodeFailedEvent | QueueNodeInIterationFailedEvent | QueueNodeExceptionEvent):
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_node_execution = self._handle_workflow_node_execution_failed(session=session, event=event)
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_node_execution = self._workflow_cycle_manager._handle_workflow_node_execution_failed(
|
|
|
|
|
session=session, event=event
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
response_finish = self._workflow_node_finish_to_stream_response(
|
|
|
|
|
node_finish_resp = self._workflow_cycle_manager._workflow_node_finish_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
event=event,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_node_execution=workflow_node_execution,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if response_finish:
|
|
|
|
|
yield response_finish
|
|
|
|
|
|
|
|
|
|
if node_finish_resp:
|
|
|
|
|
yield node_finish_resp
|
|
|
|
|
elif isinstance(event, QueueParallelBranchRunStartedEvent):
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
parallel_start_resp = self._workflow_parallel_branch_start_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
event=event,
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
parallel_start_resp = (
|
|
|
|
|
self._workflow_cycle_manager._workflow_parallel_branch_start_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
event=event,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
yield parallel_start_resp
|
|
|
|
|
@ -401,13 +409,17 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
parallel_finish_resp = self._workflow_parallel_branch_finished_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
event=event,
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
parallel_finish_resp = (
|
|
|
|
|
self._workflow_cycle_manager._workflow_parallel_branch_finished_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
event=event,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
yield parallel_finish_resp
|
|
|
|
|
@ -415,9 +427,11 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
iter_start_resp = self._workflow_iteration_start_to_stream_response(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
iter_start_resp = self._workflow_cycle_manager._workflow_iteration_start_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
@ -429,9 +443,11 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
iter_next_resp = self._workflow_iteration_next_to_stream_response(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
iter_next_resp = self._workflow_cycle_manager._workflow_iteration_next_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
@ -443,9 +459,11 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._get_workflow_run(session=session, workflow_run_id=self._workflow_run_id)
|
|
|
|
|
iter_finish_resp = self._workflow_iteration_completed_to_stream_response(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._get_workflow_run(
|
|
|
|
|
session=session, workflow_run_id=self._workflow_run_id
|
|
|
|
|
)
|
|
|
|
|
iter_finish_resp = self._workflow_cycle_manager._workflow_iteration_completed_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
@ -460,8 +478,8 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
if not graph_runtime_state:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._handle_workflow_run_success(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._handle_workflow_run_success(
|
|
|
|
|
session=session,
|
|
|
|
|
workflow_run_id=self._workflow_run_id,
|
|
|
|
|
start_at=graph_runtime_state.start_at,
|
|
|
|
|
@ -472,21 +490,23 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
trace_manager=trace_manager,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
workflow_finish_resp = self._workflow_finish_to_stream_response(
|
|
|
|
|
workflow_finish_resp = self._workflow_cycle_manager._workflow_finish_to_stream_response(
|
|
|
|
|
session=session, task_id=self._application_generate_entity.task_id, workflow_run=workflow_run
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
yield workflow_finish_resp
|
|
|
|
|
self._queue_manager.publish(QueueAdvancedChatMessageEndEvent(), PublishFrom.TASK_PIPELINE)
|
|
|
|
|
self._base_task_pipeline._queue_manager.publish(
|
|
|
|
|
QueueAdvancedChatMessageEndEvent(), PublishFrom.TASK_PIPELINE
|
|
|
|
|
)
|
|
|
|
|
elif isinstance(event, QueueWorkflowPartialSuccessEvent):
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
if not graph_runtime_state:
|
|
|
|
|
raise ValueError("graph runtime state not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._handle_workflow_run_partial_success(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._handle_workflow_run_partial_success(
|
|
|
|
|
session=session,
|
|
|
|
|
workflow_run_id=self._workflow_run_id,
|
|
|
|
|
start_at=graph_runtime_state.start_at,
|
|
|
|
|
@ -497,21 +517,23 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
conversation_id=None,
|
|
|
|
|
trace_manager=trace_manager,
|
|
|
|
|
)
|
|
|
|
|
workflow_finish_resp = self._workflow_finish_to_stream_response(
|
|
|
|
|
workflow_finish_resp = self._workflow_cycle_manager._workflow_finish_to_stream_response(
|
|
|
|
|
session=session, task_id=self._application_generate_entity.task_id, workflow_run=workflow_run
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
yield workflow_finish_resp
|
|
|
|
|
self._queue_manager.publish(QueueAdvancedChatMessageEndEvent(), PublishFrom.TASK_PIPELINE)
|
|
|
|
|
self._base_task_pipeline._queue_manager.publish(
|
|
|
|
|
QueueAdvancedChatMessageEndEvent(), PublishFrom.TASK_PIPELINE
|
|
|
|
|
)
|
|
|
|
|
elif isinstance(event, QueueWorkflowFailedEvent):
|
|
|
|
|
if not self._workflow_run_id:
|
|
|
|
|
raise ValueError("workflow run not initialized.")
|
|
|
|
|
if not graph_runtime_state:
|
|
|
|
|
raise ValueError("graph runtime state not initialized.")
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._handle_workflow_run_failed(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._handle_workflow_run_failed(
|
|
|
|
|
session=session,
|
|
|
|
|
workflow_run_id=self._workflow_run_id,
|
|
|
|
|
start_at=graph_runtime_state.start_at,
|
|
|
|
|
@ -523,20 +545,22 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
trace_manager=trace_manager,
|
|
|
|
|
exceptions_count=event.exceptions_count,
|
|
|
|
|
)
|
|
|
|
|
workflow_finish_resp = self._workflow_finish_to_stream_response(
|
|
|
|
|
workflow_finish_resp = self._workflow_cycle_manager._workflow_finish_to_stream_response(
|
|
|
|
|
session=session, task_id=self._application_generate_entity.task_id, workflow_run=workflow_run
|
|
|
|
|
)
|
|
|
|
|
err_event = QueueErrorEvent(error=ValueError(f"Run failed: {workflow_run.error}"))
|
|
|
|
|
err = self._handle_error(event=err_event, session=session, message_id=self._message_id)
|
|
|
|
|
err = self._base_task_pipeline._handle_error(
|
|
|
|
|
event=err_event, session=session, message_id=self._message_id
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
yield workflow_finish_resp
|
|
|
|
|
yield self._error_to_stream_response(err)
|
|
|
|
|
yield self._base_task_pipeline._error_to_stream_response(err)
|
|
|
|
|
break
|
|
|
|
|
elif isinstance(event, QueueStopEvent):
|
|
|
|
|
if self._workflow_run_id and graph_runtime_state:
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
workflow_run = self._handle_workflow_run_failed(
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
workflow_run = self._workflow_cycle_manager._handle_workflow_run_failed(
|
|
|
|
|
session=session,
|
|
|
|
|
workflow_run_id=self._workflow_run_id,
|
|
|
|
|
start_at=graph_runtime_state.start_at,
|
|
|
|
|
@ -547,7 +571,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
conversation_id=self._conversation_id,
|
|
|
|
|
trace_manager=trace_manager,
|
|
|
|
|
)
|
|
|
|
|
workflow_finish_resp = self._workflow_finish_to_stream_response(
|
|
|
|
|
workflow_finish_resp = self._workflow_cycle_manager._workflow_finish_to_stream_response(
|
|
|
|
|
session=session,
|
|
|
|
|
task_id=self._application_generate_entity.task_id,
|
|
|
|
|
workflow_run=workflow_run,
|
|
|
|
|
@ -561,18 +585,18 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
yield self._message_end_to_stream_response()
|
|
|
|
|
break
|
|
|
|
|
elif isinstance(event, QueueRetrieverResourcesEvent):
|
|
|
|
|
self._handle_retriever_resources(event)
|
|
|
|
|
self._message_cycle_manager._handle_retriever_resources(event)
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
message = self._get_message(session=session)
|
|
|
|
|
message.message_metadata = (
|
|
|
|
|
json.dumps(jsonable_encoder(self._task_state.metadata)) if self._task_state.metadata else None
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
elif isinstance(event, QueueAnnotationReplyEvent):
|
|
|
|
|
self._handle_annotation_reply(event)
|
|
|
|
|
self._message_cycle_manager._handle_annotation_reply(event)
|
|
|
|
|
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
message = self._get_message(session=session)
|
|
|
|
|
message.message_metadata = (
|
|
|
|
|
json.dumps(jsonable_encoder(self._task_state.metadata)) if self._task_state.metadata else None
|
|
|
|
|
@ -593,29 +617,35 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
tts_publisher.publish(queue_message)
|
|
|
|
|
|
|
|
|
|
self._task_state.answer += delta_text
|
|
|
|
|
yield self._message_to_stream_response(
|
|
|
|
|
yield self._message_cycle_manager._message_to_stream_response(
|
|
|
|
|
answer=delta_text, message_id=self._message_id, from_variable_selector=event.from_variable_selector
|
|
|
|
|
)
|
|
|
|
|
elif isinstance(event, QueueMessageReplaceEvent):
|
|
|
|
|
# published by moderation
|
|
|
|
|
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, QueueAdvancedChatMessageEndEvent):
|
|
|
|
|
if not graph_runtime_state:
|
|
|
|
|
raise ValueError("graph runtime state not initialized.")
|
|
|
|
|
|
|
|
|
|
output_moderation_answer = self._handle_output_moderation_when_task_finished(self._task_state.answer)
|
|
|
|
|
output_moderation_answer = self._base_task_pipeline._handle_output_moderation_when_task_finished(
|
|
|
|
|
self._task_state.answer
|
|
|
|
|
)
|
|
|
|
|
if output_moderation_answer:
|
|
|
|
|
self._task_state.answer = 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
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Save message
|
|
|
|
|
with Session(db.engine) as session:
|
|
|
|
|
with Session(db.engine, expire_on_commit=False) as session:
|
|
|
|
|
self._save_message(session=session, graph_runtime_state=graph_runtime_state)
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
yield self._message_end_to_stream_response()
|
|
|
|
|
elif isinstance(event, QueueAgentLogEvent):
|
|
|
|
|
yield self._handle_agent_log(task_id=self._application_generate_entity.task_id, event=event)
|
|
|
|
|
yield self._workflow_cycle_manager._handle_agent_log(
|
|
|
|
|
task_id=self._application_generate_entity.task_id, event=event
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
@ -629,7 +659,7 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
def _save_message(self, *, session: Session, graph_runtime_state: Optional[GraphRuntimeState] = None) -> None:
|
|
|
|
|
message = self._get_message(session=session)
|
|
|
|
|
message.answer = self._task_state.answer
|
|
|
|
|
message.provider_response_latency = time.perf_counter() - self._start_at
|
|
|
|
|
message.provider_response_latency = time.perf_counter() - self._base_task_pipeline._start_at
|
|
|
|
|
message.message_metadata = (
|
|
|
|
|
json.dumps(jsonable_encoder(self._task_state.metadata)) if self._task_state.metadata else None
|
|
|
|
|
)
|
|
|
|
|
@ -693,20 +723,20 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
|
|
|
|
|
:param text: text
|
|
|
|
|
:return: True if output moderation should direct output, otherwise False
|
|
|
|
|
"""
|
|
|
|
|
if self._output_moderation_handler:
|
|
|
|
|
if self._output_moderation_handler.should_direct_output():
|
|
|
|
|
if self._base_task_pipeline._output_moderation_handler:
|
|
|
|
|
if self._base_task_pipeline._output_moderation_handler.should_direct_output():
|
|
|
|
|
# stop subscribe new token when output moderation should direct output
|
|
|
|
|
self._task_state.answer = self._output_moderation_handler.get_final_output()
|
|
|
|
|
self._queue_manager.publish(
|
|
|
|
|
self._task_state.answer = self._base_task_pipeline._output_moderation_handler.get_final_output()
|
|
|
|
|
self._base_task_pipeline._queue_manager.publish(
|
|
|
|
|
QueueTextChunkEvent(text=self._task_state.answer), PublishFrom.TASK_PIPELINE
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
self._queue_manager.publish(
|
|
|
|
|
self._base_task_pipeline._queue_manager.publish(
|
|
|
|
|
QueueStopEvent(stopped_by=QueueStopEvent.StopBy.OUTPUT_MODERATION), PublishFrom.TASK_PIPELINE
|
|
|
|
|
)
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
self._output_moderation_handler.append_new_token(text)
|
|
|
|
|
self._base_task_pipeline._output_moderation_handler.append_new_token(text)
|
|
|
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|