| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | 
							- import type { FC } from 'react'
 
- import {
 
-   memo,
 
-   useCallback,
 
-   useMemo,
 
- } from 'react'
 
- import { intersectionBy } from 'lodash-es'
 
- 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 MetadataFilter from './components/metadata/metadata-filter'
 
- 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,
 
-     selectedDatasetsLoaded,
 
-     handleOnDatasetsChange,
 
-     isShowSingleRun,
 
-     hideSingleRun,
 
-     runningStatus,
 
-     handleRun,
 
-     handleStop,
 
-     query,
 
-     setQuery,
 
-     runResult,
 
-     rerankModelOpen,
 
-     setRerankModelOpen,
 
-     handleAddCondition,
 
-     handleMetadataFilterModeChange,
 
-     handleRemoveCondition,
 
-     handleToggleConditionLogicalOperator,
 
-     handleUpdateCondition,
 
-     handleMetadataModelChange,
 
-     handleMetadataCompletionParamsChange,
 
-     availableStringVars,
 
-     availableStringNodesWithParent,
 
-     availableNumberVars,
 
-     availableNumberNodesWithParent,
 
-   } = useConfig(id, data)
 
-   const handleOpenFromPropsChange = useCallback((openFromProps: boolean) => {
 
-     setRerankModelOpen(openFromProps)
 
-   }, [setRerankModelOpen])
 
-   const metadataList = useMemo(() => {
 
-     return intersectionBy(...selectedDatasets.filter((dataset) => {
 
-       return !!dataset.doc_metadata
 
-     }).map((dataset) => {
 
-       return dataset.doc_metadata!
 
-     }), 'name')
 
-   }, [selectedDatasets])
 
-   return (
 
-     <div className='pt-2'>
 
-       <div className='space-y-4 px-4 pb-2'>
 
-         {/* {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='h-3 w-px bg-gray-200'></div>)}
 
-               {!readOnly && (
 
-                 <AddKnowledge
 
-                   selectedIds={inputs.dataset_ids}
 
-                   onChange={handleOnDatasetsChange}
 
-                 />
 
-               )}
 
-             </div>
 
-           }
 
-         >
 
-           <DatasetList
 
-             list={selectedDatasets}
 
-             onChange={handleOnDatasetsChange}
 
-             readonly={readOnly}
 
-           />
 
-         </Field>
 
-       </div>
 
-       <div className='mb-2 py-2'>
 
-         <MetadataFilter
 
-           metadataList={metadataList}
 
-           selectedDatasetsLoaded={selectedDatasetsLoaded}
 
-           metadataFilterMode={inputs.metadata_filtering_mode}
 
-           metadataFilteringConditions={inputs.metadata_filtering_conditions}
 
-           handleAddCondition={handleAddCondition}
 
-           handleMetadataFilterModeChange={handleMetadataFilterModeChange}
 
-           handleRemoveCondition={handleRemoveCondition}
 
-           handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
 
-           handleUpdateCondition={handleUpdateCondition}
 
-           metadataModelConfig={inputs.metadata_model_config}
 
-           handleMetadataModelChange={handleMetadataModelChange}
 
-           handleMetadataCompletionParamsChange={handleMetadataCompletionParamsChange}
 
-           availableStringVars={availableStringVars}
 
-           availableStringNodesWithParent={availableStringNodesWithParent}
 
-           availableNumberVars={availableNumberVars}
 
-           availableNumberNodesWithParent={availableNumberNodesWithParent}
 
-         />
 
-       </div>
 
-       <Split />
 
-       <div>
 
-         <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)
 
 
  |