Spaces:
Paused
Paused
| 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) | |