feat: improve workflow run observability

This commit is contained in:
2026-06-22 03:02:08 +08:00
parent 1dd7805712
commit ae29c24529
3 changed files with 349 additions and 4 deletions
@@ -226,6 +226,49 @@ export function useEventHandler(config: EventHandlerConfig) {
!event.error &&
(!event.status || event.status === 'success' || event.status === 'completed');
const getEventDisplayName = (event: StreamEvent) => {
const typeMap: Record<string, string> = {
complete: '执行完成',
loop_start: '循环开始',
node_event: '节点事件',
resume: '恢复执行',
start: '开始执行',
};
return (
event.node_label ||
event.event?.message ||
event.event?.content ||
event.event?.type ||
event.message ||
event.content ||
typeMap[event.type] ||
event.type ||
'运行事件'
);
};
const appendObservedStep = (
event: StreamEvent,
msgId: string,
status: 'completed' | 'failed' | 'running' = 'completed',
) => {
currentSteps.value.push({
type: status === 'failed' ? 'error' : 'observation',
content: getEventDisplayName(event),
node_id: event.node_id,
node_type: event.node_type,
...buildReasoningMeta(event),
params: event.config || event.waiting_config || event.event || event.params,
output: event.outputs || event.output || event.result,
status,
timestamp: new Date().toISOString(),
});
updateAssistantMessage(msgId, {
reasoning_steps: [...currentSteps.value],
...buildMessageMeta(event),
});
};
/** 处理流式事件 */
const handleStreamEvent = (event: StreamEvent, msgId: string) => {
switch (event.type) {
@@ -600,7 +643,11 @@ export function useEventHandler(config: EventHandlerConfig) {
(s) => s.node_id === event.node_id && s.type === 'parallel_start',
);
const branchResults = event.branch_results || {};
const content = `并行分支完成:${getItemCount(branchResults)} 个分支`;
const nodeSucceeded = isSuccessEvent(event);
const content = nodeSucceeded
? `并行分支完成:${getItemCount(branchResults)} 个分支`
: `并行分支失败:${getStreamErrorMessage(event)}`;
const nodeStatus = nodeSucceeded ? 'completed' : 'failed';
if (existingIndex === -1) {
currentSteps.value.push({
type: 'parallel_complete',
@@ -612,7 +659,7 @@ export function useEventHandler(config: EventHandlerConfig) {
branch_results: branchResults,
total_tokens: event.total_tokens,
},
status: 'completed',
status: nodeStatus,
timestamp: new Date().toISOString(),
});
} else {
@@ -625,7 +672,7 @@ export function useEventHandler(config: EventHandlerConfig) {
branch_results: branchResults,
total_tokens: event.total_tokens,
},
status: 'completed',
status: nodeStatus,
};
}
updateAssistantMessage(msgId, {
@@ -673,6 +720,8 @@ export function useEventHandler(config: EventHandlerConfig) {
};
messages.value.push(newMsg);
}
} else if (nodeEvent) {
appendObservedStep(event, msgId);
}
break;
}
@@ -719,6 +768,12 @@ export function useEventHandler(config: EventHandlerConfig) {
break;
}
case 'resume': {
currentRunId.value = event.run_id || currentRunId.value;
appendObservedStep(event, msgId, 'running');
break;
}
// ========== 对话流交互事件 ==========
case 'waiting_input': {
waitingForInput.value = true;
@@ -752,6 +807,24 @@ export function useEventHandler(config: EventHandlerConfig) {
running.value = false;
break;
}
default: {
if (
event.type &&
(event.content ||
event.message ||
event.error ||
event.error_message ||
event.event)
) {
appendObservedStep(
event,
msgId,
event.error || event.error_message ? 'failed' : 'completed',
);
}
break;
}
}
};