diff --git a/web/apps/web-ele/src/api/ai-platform/ai-platform.ts b/web/apps/web-ele/src/api/ai-platform/ai-platform.ts index ad4dd16..86e6983 100644 --- a/web/apps/web-ele/src/api/ai-platform/ai-platform.ts +++ b/web/apps/web-ele/src/api/ai-platform/ai-platform.ts @@ -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>( + return requestClient.get>( `${BASE_URL}/agent/conversations/${conversationId}/messages`, { params }, ); diff --git a/web/apps/web-ele/src/views/ai-platform/agent/components/AgentChatPanel.vue b/web/apps/web-ele/src/views/ai-platform/agent/components/AgentChatPanel.vue index 08140e4..0d2a060 100644 --- a/web/apps/web-ele/src/views/ai-platform/agent/components/AgentChatPanel.vue +++ b/web/apps/web-ele/src/views/ai-platform/agent/components/AgentChatPanel.vue @@ -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; diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/index.vue b/web/apps/web-ele/src/views/ai-platform/workflow/index.vue index b2342d0..ae30ed8 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/index.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/index.vue @@ -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') }}