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[]
}
}