dify/web/app/components/workflow/nodes/knowledge-retrieval/use-single-run-form-params.ts
Wu Tianwei 14d1b3f9b3
Some checks are pending
autofix.ci / autofix (push) Waiting to run
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/amd64, build-api-amd64) (push) Waiting to run
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/arm64, build-api-arm64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/amd64, build-web-amd64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/arm64, build-web-arm64) (push) Waiting to run
Build and Push API & Web / create-manifest (api, DIFY_API_IMAGE_NAME, merge-api-images) (push) Blocked by required conditions
Build and Push API & Web / create-manifest (web, DIFY_WEB_IMAGE_NAME, merge-web-images) (push) Blocked by required conditions
Main CI Pipeline / Check Changed Files (push) Waiting to run
Main CI Pipeline / API Tests (push) Blocked by required conditions
Main CI Pipeline / Web Tests (push) Blocked by required conditions
Main CI Pipeline / Style Check (push) Waiting to run
Main CI Pipeline / VDB Tests (push) Blocked by required conditions
Main CI Pipeline / DB Migration Test (push) Blocked by required conditions
Check i18n Files and Create PR / check-and-update (push) Waiting to run
feat: multimodal support (image) (#27793)
Co-authored-by: zxhlyh <jasonapring2015@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-09 11:44:50 +08:00

118 lines
3.9 KiB
TypeScript

import type { RefObject } from 'react'
import { useTranslation } from 'react-i18next'
import type { InputVar, Var, Variable } from '@/app/components/workflow/types'
import { InputVarType, VarType } from '@/app/components/workflow/types'
import { useCallback, useMemo } from 'react'
import type { KnowledgeRetrievalNodeType } from './types'
import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
import type { DataSet } from '@/models/datasets'
import useAvailableVarList from '../_base/hooks/use-available-var-list'
import { findVariableWhenOnLLMVision } from '../utils'
const i18nPrefix = 'workflow.nodes.knowledgeRetrieval'
type Params = {
id: string,
payload: KnowledgeRetrievalNodeType
runInputData: Record<string, any>
runInputDataRef: RefObject<Record<string, any>>
getInputVars: (textList: string[]) => InputVar[]
setRunInputData: (data: Record<string, any>) => void
toVarInputs: (variables: Variable[]) => InputVar[]
}
const useSingleRunFormParams = ({
id,
payload,
runInputData,
runInputDataRef,
setRunInputData,
}: Params) => {
const { t } = useTranslation()
const datasetsDetail = useDatasetsDetailStore(s => s.datasetsDetail)
const query = runInputData.query
const queryAttachment = runInputData.queryAttachment
const setQuery = useCallback((newQuery: string) => {
setRunInputData({
...runInputDataRef.current,
query: newQuery,
})
}, [runInputDataRef, setRunInputData])
const setQueryAttachment = useCallback((newQueryAttachment: string) => {
setRunInputData({
...runInputDataRef.current,
queryAttachment: newQueryAttachment,
})
}, [runInputDataRef, setRunInputData])
const filterFileVar = useCallback((varPayload: Var) => {
return [VarType.file, VarType.arrayFile].includes(varPayload.type)
}, [])
// Get all variables from previous nodes that are file or array of file
const {
availableVars: availableFileVars,
} = useAvailableVarList(id, {
onlyLeafNodeVar: false,
filterVar: filterFileVar,
})
const forms = useMemo(() => {
const datasetIds = payload.dataset_ids
const datasets = datasetIds.reduce<DataSet[]>((acc, id) => {
if (datasetsDetail[id])
acc.push(datasetsDetail[id])
return acc
}, [])
const hasMultiModalDatasets = datasets.some(d => d.is_multimodal)
const inputFields: FormProps[] = [
{
inputs: [{
label: t(`${i18nPrefix}.queryText`)!,
variable: 'query',
type: InputVarType.paragraph,
required: false,
}],
values: { query },
onChange: (keyValue: Record<string, any>) => setQuery(keyValue.query),
},
]
if (hasMultiModalDatasets) {
const currentVariable = findVariableWhenOnLLMVision(payload.query_attachment_selector, availableFileVars)
inputFields.push(
{
inputs: [{
label: t(`${i18nPrefix}.queryAttachment`)!,
variable: 'queryAttachment',
type: currentVariable?.formType as InputVarType,
required: false,
}],
values: { queryAttachment },
onChange: (keyValue: Record<string, any>) => setQueryAttachment(keyValue.queryAttachment),
},
)
}
return inputFields
}, [query, setQuery, t, datasetsDetail, payload.dataset_ids, payload.query_attachment_selector, availableFileVars, queryAttachment, setQueryAttachment])
const getDependentVars = () => {
return [payload.query_variable_selector, payload.query_attachment_selector]
}
const getDependentVar = (variable: string) => {
if (variable === 'query')
return payload.query_variable_selector
if (variable === 'queryAttachment')
return payload.query_attachment_selector
}
return {
forms,
getDependentVars,
getDependentVar,
}
}
export default useSingleRunFormParams