|
import type { FC } from 'react' |
|
import { |
|
memo, |
|
useCallback, |
|
} from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import VarReferencePicker from '../_base/components/variable/var-reference-picker' |
|
import useConfig from './use-config' |
|
import RetrievalConfig from './components/retrieval-config' |
|
import AddKnowledge from './components/add-dataset' |
|
import DatasetList from './components/dataset-list' |
|
import type { KnowledgeRetrievalNodeType } from './types' |
|
import Field from '@/app/components/workflow/nodes/_base/components/field' |
|
import Split from '@/app/components/workflow/nodes/_base/components/split' |
|
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' |
|
import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types' |
|
import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form' |
|
import ResultPanel from '@/app/components/workflow/run/result-panel' |
|
|
|
const i18nPrefix = 'workflow.nodes.knowledgeRetrieval' |
|
|
|
const Panel: FC<NodePanelProps<KnowledgeRetrievalNodeType>> = ({ |
|
id, |
|
data, |
|
}) => { |
|
const { t } = useTranslation() |
|
|
|
const { |
|
readOnly, |
|
inputs, |
|
handleQueryVarChange, |
|
filterVar, |
|
handleModelChanged, |
|
handleCompletionParamsChange, |
|
handleRetrievalModeChange, |
|
handleMultipleRetrievalConfigChange, |
|
selectedDatasets, |
|
handleOnDatasetsChange, |
|
isShowSingleRun, |
|
hideSingleRun, |
|
runningStatus, |
|
handleRun, |
|
handleStop, |
|
query, |
|
setQuery, |
|
runResult, |
|
rerankModelOpen, |
|
setRerankModelOpen, |
|
} = useConfig(id, data) |
|
|
|
const handleOpenFromPropsChange = useCallback((openFromProps: boolean) => { |
|
setRerankModelOpen(openFromProps) |
|
}, [setRerankModelOpen]) |
|
|
|
return ( |
|
<div className='mt-2'> |
|
<div className='px-4 pb-4 space-y-4'> |
|
{/* {JSON.stringify(inputs, null, 2)} */} |
|
<Field |
|
title={t(`${i18nPrefix}.queryVariable`)} |
|
> |
|
<VarReferencePicker |
|
nodeId={id} |
|
readonly={readOnly} |
|
isShowNodeName |
|
value={inputs.query_variable_selector} |
|
onChange={handleQueryVarChange} |
|
filterVar={filterVar} |
|
/> |
|
</Field> |
|
|
|
<Field |
|
title={t(`${i18nPrefix}.knowledge`)} |
|
operations={ |
|
<div className='flex items-center space-x-1'> |
|
<RetrievalConfig |
|
payload={{ |
|
retrieval_mode: inputs.retrieval_mode, |
|
multiple_retrieval_config: inputs.multiple_retrieval_config, |
|
single_retrieval_config: inputs.single_retrieval_config, |
|
}} |
|
onRetrievalModeChange={handleRetrievalModeChange} |
|
onMultipleRetrievalConfigChange={handleMultipleRetrievalConfigChange} |
|
singleRetrievalModelConfig={inputs.single_retrieval_config?.model} |
|
onSingleRetrievalModelChange={handleModelChanged as any} |
|
onSingleRetrievalModelParamsChange={handleCompletionParamsChange} |
|
readonly={readOnly || !selectedDatasets.length} |
|
openFromProps={rerankModelOpen} |
|
onOpenFromPropsChange={handleOpenFromPropsChange} |
|
selectedDatasets={selectedDatasets} |
|
/> |
|
{!readOnly && (<div className='w-px h-3 bg-gray-200'></div>)} |
|
{!readOnly && ( |
|
<AddKnowledge |
|
selectedIds={inputs.dataset_ids} |
|
onChange={handleOnDatasetsChange} |
|
/> |
|
)} |
|
</div> |
|
} |
|
> |
|
<DatasetList |
|
list={selectedDatasets} |
|
onChange={handleOnDatasetsChange} |
|
readonly={readOnly} |
|
/> |
|
</Field> |
|
</div> |
|
|
|
<Split /> |
|
<div className='px-4 pt-4 pb-2'> |
|
<OutputVars> |
|
<> |
|
<VarItem |
|
name='result' |
|
type='Array[Object]' |
|
description={t(`${i18nPrefix}.outputVars.output`)} |
|
subItems={[ |
|
{ |
|
name: 'content', |
|
type: 'string', |
|
description: t(`${i18nPrefix}.outputVars.content`), |
|
}, |
|
// url, title, link like bing search reference result: link, link page title, link page icon |
|
{ |
|
name: 'title', |
|
type: 'string', |
|
description: t(`${i18nPrefix}.outputVars.title`), |
|
}, |
|
{ |
|
name: 'url', |
|
type: 'string', |
|
description: t(`${i18nPrefix}.outputVars.url`), |
|
}, |
|
{ |
|
name: 'icon', |
|
type: 'string', |
|
description: t(`${i18nPrefix}.outputVars.icon`), |
|
}, |
|
{ |
|
name: 'metadata', |
|
type: 'object', |
|
description: t(`${i18nPrefix}.outputVars.metadata`), |
|
}, |
|
]} |
|
/> |
|
|
|
</> |
|
</OutputVars> |
|
{isShowSingleRun && ( |
|
<BeforeRunForm |
|
nodeName={inputs.title} |
|
onHide={hideSingleRun} |
|
forms={[ |
|
{ |
|
inputs: [{ |
|
label: t(`${i18nPrefix}.queryVariable`)!, |
|
variable: 'query', |
|
type: InputVarType.paragraph, |
|
required: true, |
|
}], |
|
values: { query }, |
|
onChange: keyValue => setQuery((keyValue as any).query), |
|
}, |
|
]} |
|
runningStatus={runningStatus} |
|
onRun={handleRun} |
|
onStop={handleStop} |
|
result={<ResultPanel {...runResult} showSteps={false} />} |
|
/> |
|
)} |
|
</div> |
|
</div> |
|
) |
|
} |
|
|
|
export default memo(Panel) |
|
|