fix: surface agent workflow progress

This commit is contained in:
2026-06-13 13:20:13 +08:00
parent 1d98d831e3
commit 70e3b1859a
3 changed files with 75 additions and 8 deletions
@@ -1222,6 +1222,7 @@ export interface AgentChatEvent {
| 'complete'
| 'error'
| 'knowledge_retrieval'
| 'llm_chunk'
| 'node_complete'
| 'node_event'
| 'node_start'
@@ -1235,8 +1236,10 @@ export interface AgentChatEvent {
message_id?: string;
conversation_id?: string;
tokens_used?: number;
total_tokens?: number;
elapsed_time?: number;
config?: WaitingInputConfig;
accumulated_content?: string;
// 对话流模式:节点执行事件
node_id?: string;
node_type?: string;
@@ -1436,7 +1439,7 @@ export async function getAgentMessagesApi(
conversationId: string,
params?: { page?: number; pageSize?: number },
) {
return requestClient.get<PaginatedResponse<AgentMessage>>(
return requestClient.get<AgentMessage[] | PaginatedResponse<AgentMessage>>(
`${BASE_URL}/agent/conversations/${conversationId}/messages`,
{ params },
);
@@ -140,7 +140,7 @@ async function loadMessages(convId: string) {
try {
const res = await getAgentMessagesApi(convId, { pageSize: 100 });
chatMessages.value = res.items;
chatMessages.value = Array.isArray(res) ? res : res.items || [];
conversationId.value = convId;
await nextTick();
scrollToBottom();
@@ -312,9 +312,20 @@ function handleStreamEvent(
break;
}
case 'llm_chunk': {
currentStep.value = 'answering';
streamingContent.value =
event.accumulated_content ||
`${streamingContent.value}${event.content || ''}`;
assistantMessage.content = streamingContent.value;
assistantMessage.status = 'pending';
break;
}
case 'complete': {
assistantMessage.status = 'completed';
assistantMessage.total_tokens = event.tokens_used || 0;
assistantMessage.total_tokens =
event.tokens_used || event.total_tokens || 0;
assistantMessage.elapsed_time = event.elapsed_time || 0;
currentStep.value = '';
break;
@@ -346,6 +346,63 @@ function handleWorkflowRunEvent(event: WorkflowStreamEvent) {
);
break;
}
case 'llm_chunk': {
const content = event.accumulated_content || event.content || '';
if (content) {
const preview = content.length > 180 ? `${content.slice(0, 180)}...` : content;
pushRunEvent(
`智能体输出:${event.node_label || event.node_id || '节点'}`,
'running',
preview,
);
}
break;
}
case 'answer': {
if (event.content) {
pushRunEvent('节点消息', 'info', event.content);
}
break;
}
case 'parallel_start': {
pushRunEvent(
`开始并行分支:${event.node_label || event.node_id || '节点'}`,
'running',
event.branches?.join(' / '),
);
break;
}
case 'parallel_complete': {
pushRunEvent(
`并行分支完成:${event.node_label || event.node_id || '节点'}`,
'success',
);
break;
}
case 'loop_iteration_start': {
pushRunEvent(
`循环第 ${(event.iteration || 0) + 1} 轮开始`,
'running',
event.node_label || event.node_id,
);
break;
}
case 'loop_iteration_complete': {
pushRunEvent(
`循环第 ${(event.iteration || 0) + 1} 轮完成`,
'success',
event.node_label || event.node_id,
);
break;
}
case 'loop_iteration_error': {
pushRunEvent(
`循环第 ${(event.iteration || 0) + 1} 轮失败`,
'failed',
event.error || event.error_message,
);
break;
}
case 'complete': {
runStatus.value = 'completed';
runElapsedTime.value = event.elapsed_time || 0;
@@ -653,11 +710,7 @@ onUnmounted(() => {
{{ $t('ai-platform.workflow.publish') }}
</ElDropdownItem>
<ElDropdownItem
v-if="
item.status === 'published' &&
(item.workflow_type === 'data_process' ||
item.workflow_type === 'automation')
"
v-if="item.status === 'published'"
command="run"
>
<Play class="mr-2 h-4 w-4" />