diff --git a/web/app/components/app/text-generate/item/result-tab.tsx b/web/app/components/app/text-generate/item/result-tab.tsx index 7ee1f4f3cd..2c3d472db9 100644 --- a/web/app/components/app/text-generate/item/result-tab.tsx +++ b/web/app/components/app/text-generate/item/result-tab.tsx @@ -4,12 +4,11 @@ import { } from 'react' import { useTranslation } from 'react-i18next' import cn from '@/utils/classnames' -// import Loading from '@/app/components/base/loading' import { Markdown } from '@/app/components/base/markdown' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor' import { CodeLanguage } from '@/app/components/workflow/nodes/code/types' import type { WorkflowProcess } from '@/app/components/base/chat/types' -// import { WorkflowRunningStatus } from '@/app/components/workflow/types' +import { FileList } from '@/app/components/base/file-uploader' const ResultTab = ({ data, @@ -56,7 +55,16 @@ const ResultTab = ({ )}
{currentTab === 'RESULT' && ( - + <> + + {data?.files?.length && ( + + )} + )} {currentTab === 'DETAIL' && content && ( = ({ image_file_size_limit: appParams?.system_parameters?.image_file_size_limit, }) const prompt_variables = userInputsFormToPromptVariables(user_input_form) - console.log(prompt_variables) setPromptConfig({ prompt_template: '', // placeholder for future prompt_variables, diff --git a/web/app/components/share/text-generation/result/index.tsx b/web/app/components/share/text-generation/result/index.tsx index a61302fc98..80abb2b829 100644 --- a/web/app/components/share/text-generation/result/index.tsx +++ b/web/app/components/share/text-generation/result/index.tsx @@ -20,6 +20,9 @@ import type { WorkflowProcess } from '@/app/components/base/chat/types' import { sleep } from '@/utils' import type { SiteInfo } from '@/models/share' import { TEXT_GENERATION_TIMEOUT_MS } from '@/config' +import { + getProcessedFilesFromResponse, +} from '@/app/components/base/file-uploader/utils' export type IResultProps = { isWorkflow: boolean @@ -295,6 +298,7 @@ const Result: FC = ({ if (isStringOutput) { setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => { draft.resultText = data.outputs[Object.keys(data.outputs)[0]] + draft.files = getProcessedFilesFromResponse(data.files || []) })) } } diff --git a/web/app/components/share/text-generation/run-once/index.tsx b/web/app/components/share/text-generation/run-once/index.tsx index d804deadab..4cd56e8cef 100644 --- a/web/app/components/share/text-generation/run-once/index.tsx +++ b/web/app/components/share/text-generation/run-once/index.tsx @@ -14,7 +14,6 @@ import TextGenerationImageUploader from '@/app/components/base/image-uploader/te import type { VisionFile, VisionSettings } from '@/types/app' import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader' import { getProcessedFiles } from '@/app/components/base/file-uploader/utils' -// import { InputVarType } from '@/app/components/workflow/types' export type IRunOnceProps = { siteInfo: SiteInfo diff --git a/web/app/components/workflow/hooks/use-workflow-run.ts b/web/app/components/workflow/hooks/use-workflow-run.ts index 68c3ff0a4b..0bbb1adab8 100644 --- a/web/app/components/workflow/hooks/use-workflow-run.ts +++ b/web/app/components/workflow/hooks/use-workflow-run.ts @@ -24,6 +24,9 @@ import { } from '@/service/workflow' import { useFeaturesStore } from '@/app/components/base/features/hooks' import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' +import { + getProcessedFilesFromResponse, +} from '@/app/components/base/file-uploader/utils' export const useWorkflowRun = () => { const store = useStoreApi() @@ -207,6 +210,7 @@ export const useWorkflowRun = () => { draft.result = { ...draft.result, ...data, + files: getProcessedFilesFromResponse(data.files || []), } as any if (isStringOutput) { draft.resultTabActive = true diff --git a/web/app/components/workflow/panel/inputs-panel.tsx b/web/app/components/workflow/panel/inputs-panel.tsx index e28ff4547e..16ed730dc6 100644 --- a/web/app/components/workflow/panel/inputs-panel.tsx +++ b/web/app/components/workflow/panel/inputs-panel.tsx @@ -1,5 +1,6 @@ import { memo, + useCallback, useMemo, } from 'react' import { useTranslation } from 'react-i18next' @@ -14,7 +15,7 @@ import { useStore, useWorkflowStore, } from '../store' -import { useWorkflowRun } from '../hooks' +import { useCheckStartNodeForm, useWorkflowRun } from '../hooks' import type { StartNodeType } from '../nodes/start/types' import { TransferMethod } from '../../base/text-generation/types' import Button from '@/app/components/base/button' @@ -55,6 +56,8 @@ const InputsPanel = ({ onRun }: Props) => { return data }, [fileSettings?.image?.enabled, startVariables]) + const { getProcessedInputs } = useCheckStartNodeForm() + const handleValueChange = (variable: string, v: any) => { const { inputs, @@ -73,17 +76,17 @@ const InputsPanel = ({ onRun }: Props) => { } } - const doRun = () => { + const doRun = useCallback(() => { onRun() - handleRun({ inputs, files }) - } + handleRun({ inputs: getProcessedInputs(inputs), files }) + }, [files, getProcessedInputs, handleRun, inputs, onRun]) - const canRun = (() => { + const canRun = useMemo(() => { if (files?.some(item => (item.transfer_method as any) === TransferMethod.local_file && !item.upload_file_id)) return false return true - })() + }, [files]) return ( <> diff --git a/web/app/components/workflow/panel/workflow-preview.tsx b/web/app/components/workflow/panel/workflow-preview.tsx index 0c751f0360..361f9d6bf4 100644 --- a/web/app/components/workflow/panel/workflow-preview.tsx +++ b/web/app/components/workflow/panel/workflow-preview.tsx @@ -157,6 +157,7 @@ const WorkflowPreview = () => { switchTab('DETAIL')} /> diff --git a/web/app/components/workflow/run/result-text.tsx b/web/app/components/workflow/run/result-text.tsx index 63ce9adec5..ddcaeb21b7 100644 --- a/web/app/components/workflow/run/result-text.tsx +++ b/web/app/components/workflow/run/result-text.tsx @@ -5,12 +5,15 @@ import { ImageIndentLeft } from '@/app/components/base/icons/src/vender/line/edi import { Markdown } from '@/app/components/base/markdown' import LoadingAnim from '@/app/components/base/chat/chat/loading-anim' import StatusContainer from '@/app/components/workflow/run/status-container' +import { FileList } from '@/app/components/base/file-uploader' +import type { FileEntity } from '@/app/components/base/file-uploader/types' type ResultTextProps = { isRunning?: boolean outputs?: any error?: string onClick?: () => void + allFiles?: FileEntity[] } const ResultText: FC = ({ @@ -18,6 +21,7 @@ const ResultText: FC = ({ outputs, error, onClick, + allFiles, }) => { const { t } = useTranslation() return ( @@ -48,6 +52,13 @@ const ResultText: FC = ({ {outputs && (
+ {allFiles?.length && ( + + )}
)}
diff --git a/web/app/components/workflow/types.ts b/web/app/components/workflow/types.ts index 02fb50ab06..4c2f55f110 100644 --- a/web/app/components/workflow/types.ts +++ b/web/app/components/workflow/types.ts @@ -6,7 +6,7 @@ import type { import type { Resolution, TransferMethod } from '@/types/app' import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types' import type { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types' -import type { NodeTracing } from '@/types/workflow' +import type { FileResponse, NodeTracing } from '@/types/workflow' import type { Collection, Tool } from '@/app/components/tools/types' import type { ChatVarType } from '@/app/components/workflow/panel/chat-variable-panel/type' @@ -326,6 +326,7 @@ export type WorkflowRunningData = { steps?: number showSteps?: boolean total_steps?: number + files?: FileResponse[] } tracing?: NodeTracing[] } diff --git a/web/types/workflow.ts b/web/types/workflow.ts index f642d5bfec..810026b084 100644 --- a/web/types/workflow.ts +++ b/web/types/workflow.ts @@ -109,6 +109,7 @@ export type WorkflowFinishedResponse = { email: string } finished_at: number + files?: FileResponse[] } }