|
|
|
@@ -67,24 +67,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, |
|
|
|
@@ -96,7 +89,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, |
|
|
|
@@ -113,32 +106,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._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]]: |
|
|
|
""" |
|
|
|
@@ -146,13 +142,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) |
|
|
|
@@ -269,24 +265,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, |
|
|
|
@@ -297,7 +295,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() |
|
|
|
@@ -310,12 +308,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, |
|
|
|
@@ -329,13 +329,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, |
|
|
|
@@ -348,12 +350,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, |
|
|
|
@@ -364,10 +370,12 @@ 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 |
|
|
|
) |
|
|
|
|
|
|
|
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, |
|
|
|
@@ -381,13 +389,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_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 |
|
|
|
@@ -395,13 +407,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 |
|
|
|
@@ -409,9 +425,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, |
|
|
|
@@ -423,9 +441,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, |
|
|
|
@@ -437,9 +457,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, |
|
|
|
@@ -454,8 +476,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, |
|
|
|
@@ -466,21 +488,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, |
|
|
|
@@ -491,21 +515,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, |
|
|
|
@@ -517,20 +543,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, |
|
|
|
@@ -541,7 +569,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, |
|
|
|
@@ -555,18 +583,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 |
|
|
|
@@ -587,23 +615,27 @@ 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() |
|
|
|
|
|
|
|
@@ -621,7 +653,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 |
|
|
|
) |
|
|
|
@@ -685,20 +717,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 |
|
|
|
|