|
@@ -9,6 +9,7 @@ from sqlalchemy.orm import Session
|
|
|
|
|
|
from core.app.entities.app_invoke_entities import AdvancedChatAppGenerateEntity, InvokeFrom, WorkflowAppGenerateEntity
|
|
|
from core.app.entities.queue_entities import (
|
|
|
+ QueueAgentLogEvent,
|
|
|
QueueIterationCompletedEvent,
|
|
|
QueueIterationNextEvent,
|
|
|
QueueIterationStartEvent,
|
|
@@ -21,6 +22,7 @@ from core.app.entities.queue_entities import (
|
|
|
QueueParallelBranchRunSucceededEvent,
|
|
|
)
|
|
|
from core.app.entities.task_entities import (
|
|
|
+ AgentLogStreamResponse,
|
|
|
IterationNodeCompletedStreamResponse,
|
|
|
IterationNodeNextStreamResponse,
|
|
|
IterationNodeStartStreamResponse,
|
|
@@ -63,6 +65,7 @@ class WorkflowCycleManage:
|
|
|
_task_state: WorkflowTaskState
|
|
|
_workflow_system_variables: dict[SystemVariableKey, Any]
|
|
|
_wip_workflow_node_executions: dict[str, WorkflowNodeExecution]
|
|
|
+ _wip_workflow_agent_logs: dict[str, list[AgentLogStreamResponse.Data]]
|
|
|
|
|
|
def _handle_workflow_run_start(self) -> WorkflowRun:
|
|
|
max_sequence = (
|
|
@@ -283,9 +286,16 @@ class WorkflowCycleManage:
|
|
|
inputs = WorkflowEntry.handle_special_values(event.inputs)
|
|
|
process_data = WorkflowEntry.handle_special_values(event.process_data)
|
|
|
outputs = WorkflowEntry.handle_special_values(event.outputs)
|
|
|
- execution_metadata = (
|
|
|
- json.dumps(jsonable_encoder(event.execution_metadata)) if event.execution_metadata else None
|
|
|
- )
|
|
|
+ execution_metadata_dict = event.execution_metadata
|
|
|
+ if self._wip_workflow_agent_logs.get(event.node_execution_id):
|
|
|
+ if not execution_metadata_dict:
|
|
|
+ execution_metadata_dict = {}
|
|
|
+
|
|
|
+ execution_metadata_dict[NodeRunMetadataKey.AGENT_LOG] = self._wip_workflow_agent_logs.get(
|
|
|
+ event.node_execution_id, []
|
|
|
+ )
|
|
|
+
|
|
|
+ execution_metadata = json.dumps(jsonable_encoder(execution_metadata_dict)) if execution_metadata_dict else None
|
|
|
finished_at = datetime.now(UTC).replace(tzinfo=None)
|
|
|
elapsed_time = (finished_at - event.start_at).total_seconds()
|
|
|
|
|
@@ -332,9 +342,16 @@ class WorkflowCycleManage:
|
|
|
outputs = WorkflowEntry.handle_special_values(event.outputs)
|
|
|
finished_at = datetime.now(UTC).replace(tzinfo=None)
|
|
|
elapsed_time = (finished_at - event.start_at).total_seconds()
|
|
|
- execution_metadata = (
|
|
|
- json.dumps(jsonable_encoder(event.execution_metadata)) if event.execution_metadata else None
|
|
|
- )
|
|
|
+ execution_metadata_dict = event.execution_metadata
|
|
|
+ if self._wip_workflow_agent_logs.get(event.node_execution_id):
|
|
|
+ if not execution_metadata_dict:
|
|
|
+ execution_metadata_dict = {}
|
|
|
+
|
|
|
+ execution_metadata_dict[NodeRunMetadataKey.AGENT_LOG] = self._wip_workflow_agent_logs.get(
|
|
|
+ event.node_execution_id, []
|
|
|
+ )
|
|
|
+
|
|
|
+ execution_metadata = json.dumps(jsonable_encoder(execution_metadata_dict)) if execution_metadata_dict else None
|
|
|
db.session.query(WorkflowNodeExecution).filter(WorkflowNodeExecution.id == workflow_node_execution.id).update(
|
|
|
{
|
|
|
WorkflowNodeExecution.status: WorkflowNodeExecutionStatus.FAILED.value,
|
|
@@ -746,3 +763,52 @@ class WorkflowCycleManage:
|
|
|
raise Exception(f"Workflow node execution not found: {node_execution_id}")
|
|
|
|
|
|
return workflow_node_execution
|
|
|
+
|
|
|
+ def _handle_agent_log(self, task_id: str, event: QueueAgentLogEvent) -> AgentLogStreamResponse:
|
|
|
+ """
|
|
|
+ Handle agent log
|
|
|
+ :param task_id: task id
|
|
|
+ :param event: agent log event
|
|
|
+ :return:
|
|
|
+ """
|
|
|
+ node_execution = self._wip_workflow_node_executions.get(event.node_execution_id)
|
|
|
+ if not node_execution:
|
|
|
+ raise Exception(f"Workflow node execution not found: {event.node_execution_id}")
|
|
|
+
|
|
|
+ node_execution_id = node_execution.id
|
|
|
+ original_agent_logs = self._wip_workflow_agent_logs.get(node_execution_id, [])
|
|
|
+
|
|
|
+ # try to find the log with the same id
|
|
|
+ for log in original_agent_logs:
|
|
|
+ if log.id == event.id:
|
|
|
+ # update the log
|
|
|
+ log.status = event.status
|
|
|
+ log.error = event.error
|
|
|
+ log.data = event.data
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ # append the log
|
|
|
+ original_agent_logs.append(
|
|
|
+ AgentLogStreamResponse.Data(
|
|
|
+ id=event.id,
|
|
|
+ parent_id=event.parent_id,
|
|
|
+ node_execution_id=node_execution_id,
|
|
|
+ error=event.error,
|
|
|
+ status=event.status,
|
|
|
+ data=event.data,
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ self._wip_workflow_agent_logs[node_execution_id] = original_agent_logs
|
|
|
+
|
|
|
+ return AgentLogStreamResponse(
|
|
|
+ task_id=task_id,
|
|
|
+ data=AgentLogStreamResponse.Data(
|
|
|
+ node_execution_id=node_execution_id,
|
|
|
+ id=event.id,
|
|
|
+ parent_id=event.parent_id,
|
|
|
+ error=event.error,
|
|
|
+ status=event.status,
|
|
|
+ data=event.data,
|
|
|
+ ),
|
|
|
+ )
|