diff --git a/web/app/components/app/text-generate/item/index.tsx b/web/app/components/app/text-generate/item/index.tsx index d3b9d75526..32cd6fee20 100644 --- a/web/app/components/app/text-generate/item/index.tsx +++ b/web/app/components/app/text-generate/item/index.tsx @@ -23,10 +23,13 @@ import { fetchTextGenerationMessge } from '@/service/debug' import AnnotationCtrlBtn from '@/app/components/app/configuration/toolbox/annotation/annotation-ctrl-btn' import EditReplyModal from '@/app/components/app/annotation/edit-annotation-modal' import { useStore as useAppStore } from '@/app/components/app/store' +import WorkflowProcessItem from '@/app/components/base/chat/chat/answer/workflow-process' +import type { WorkflowProcess } from '@/app/components/base/chat/types' const MAX_DEPTH = 3 export type IGenerationItemProps = { isWorkflow?: boolean + workflowProcessData?: WorkflowProcess className?: string isError: boolean onRetry: () => void @@ -78,6 +81,7 @@ export const copyIcon = ( const GenerationItem: FC = ({ isWorkflow, + workflowProcessData, className, isError, onRetry, @@ -280,6 +284,9 @@ const GenerationItem: FC = ({ }
+ {workflowProcessData && ( + + )} {isError ?
{t('share.generation.batchFailed.outputPlaceholder')}
: ( diff --git a/web/app/components/base/chat/chat/answer/workflow-process.tsx b/web/app/components/base/chat/chat/answer/workflow-process.tsx index cf352ff5d2..e24ea67110 100644 --- a/web/app/components/base/chat/chat/answer/workflow-process.tsx +++ b/web/app/components/base/chat/chat/answer/workflow-process.tsx @@ -13,9 +13,11 @@ import NodePanel from '@/app/components/workflow/run/node' type WorkflowProcessProps = { data: WorkflowProcess + grayBg?: boolean } const WorkflowProcessItem = ({ data, + grayBg, }: WorkflowProcessProps) => { const { t } = useTranslation() const [collapse, setCollapse] = useState(true) @@ -37,9 +39,9 @@ const WorkflowProcessItem = ({ return (
{t('workflow.common.workflowProcess')}
- +
{ !collapse && ( diff --git a/web/app/components/share/text-generation/result/index.tsx b/web/app/components/share/text-generation/result/index.tsx index 406f778860..d5ab8341c5 100644 --- a/web/app/components/share/text-generation/result/index.tsx +++ b/web/app/components/share/text-generation/result/index.tsx @@ -3,6 +3,7 @@ import type { FC } from 'react' import React, { useEffect, useRef, useState } from 'react' import { useBoolean } from 'ahooks' import { t } from 'i18next' +import produce from 'immer' import cn from 'classnames' import TextGenerationRes from '@/app/components/app/text-generate/item' import NoData from '@/app/components/share/text-generation/no-data' @@ -14,7 +15,8 @@ import type { PromptConfig } from '@/models/debug' import type { InstalledApp } from '@/models/explore' import type { ModerationService } from '@/models/common' import { TransferMethod, type VisionFile, type VisionSettings } from '@/types/app' -import { BlockEnum } from '@/app/components/workflow/types' +import { BlockEnum, NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types' +import type { WorkflowProcess } from '@/app/components/base/chat/types' export type IResultProps = { isWorkflow: boolean @@ -76,6 +78,14 @@ const Result: FC = ({ doSetCompletionRes(res) } const getCompletionRes = () => completionResRef.current + const [workflowProcessData, doSetWorkflowProccessData] = useState() + const workflowProcessDataRef = useRef() + const setWorkflowProccessData = (data: WorkflowProcess) => { + workflowProcessDataRef.current = data + doSetWorkflowProccessData(data) + } + const getWorkflowProccessData = () => workflowProcessDataRef.current + const { notify } = Toast const isNoData = !completionRes @@ -188,12 +198,28 @@ const Result: FC = ({ { onWorkflowStarted: ({ workflow_run_id }) => { tempMessageId = workflow_run_id + setWorkflowProccessData({ + status: WorkflowRunningStatus.Running, + tracing: [], + }) + setRespondingFalse() // console.log('onWorkflowStarted runID: ', workflow_run_id) }, onNodeStarted: ({ data }) => { + setWorkflowProccessData(produce(getWorkflowProccessData()!, (draft) => { + draft.tracing!.push({ + ...data, + status: NodeRunningStatus.Running, + } as any) + })) // console.log('onNodeStarted: ', data.node_type) }, onNodeFinished: ({ data }) => { + setWorkflowProccessData(produce(getWorkflowProccessData()!, (draft) => { + const currentIndex = draft.tracing!.findIndex(trace => trace.node_id === data.node_id) + if (currentIndex > -1 && draft.tracing) + draft.tracing[currentIndex] = data as any + })) // console.log('onNodeFinished: ', data.node_type, data) if (data.node_type === BlockEnum.LLM && data.outputs.text) setCompletionRes(data.outputs.text) @@ -215,6 +241,9 @@ const Result: FC = ({ notify({ type: 'info', message: 'Outputs not existed.' }) setCompletionRes('') } + setWorkflowProccessData(produce(getWorkflowProccessData()!, (draft) => { + draft.status = data.error ? WorkflowRunningStatus.Failed : WorkflowRunningStatus.Succeeded + })) setRespondingFalse() setMessageId(tempMessageId) onCompleted(getCompletionRes(), taskId, true) @@ -271,6 +300,7 @@ const Result: FC = ({ const renderTextGenerationRes = () => ( = ({ nodeInfo, collapsed = true, className }) => {
setCollapseState(!collapseState)} >