Spaces:
Build error
Build error
'use client' | |
import { useCallback, useState } from 'react' | |
import { useRouter } from 'next/navigation' | |
import { RiArrowLeftLine, RiArrowRightLine } from '@remixicon/react' | |
import { useTranslation } from 'react-i18next' | |
import KnowledgeBaseInfo from './KnowledgeBaseInfo' | |
import ExternalApiSelection from './ExternalApiSelection' | |
import RetrievalSettings from './RetrievalSettings' | |
import InfoPanel from './InfoPanel' | |
import type { CreateKnowledgeBaseReq } from './declarations' | |
import Divider from '@/app/components/base/divider' | |
import Button from '@/app/components/base/button' | |
type ExternalKnowledgeBaseCreateProps = { | |
onConnect: (formValue: CreateKnowledgeBaseReq) => void | |
loading: boolean | |
} | |
const ExternalKnowledgeBaseCreate: React.FC<ExternalKnowledgeBaseCreateProps> = ({ onConnect, loading }) => { | |
const { t } = useTranslation() | |
const router = useRouter() | |
const [formData, setFormData] = useState<CreateKnowledgeBaseReq>({ | |
name: '', | |
description: '', | |
external_knowledge_api_id: '', | |
external_knowledge_id: '', | |
external_retrieval_model: { | |
top_k: 2, | |
score_threshold: 0.5, | |
score_threshold_enabled: false, | |
}, | |
provider: 'external', | |
}) | |
const navBackHandle = useCallback(() => { | |
router.replace('/datasets') | |
}, [router]) | |
const handleFormChange = (newData: CreateKnowledgeBaseReq) => { | |
setFormData(newData) | |
} | |
const isFormValid = formData.name.trim() !== '' | |
&& formData.external_knowledge_api_id !== '' | |
&& formData.external_knowledge_id !== '' | |
&& formData.external_retrieval_model.top_k !== undefined | |
&& formData.external_retrieval_model.score_threshold !== undefined | |
return ( | |
<div className='flex flex-col flex-grow self-stretch rounded-t-2xl border-t border-effects-highlight bg-components-panel-bg'> | |
<div className='flex justify-center flex-grow self-stretch'> | |
<div className='flex w-full max-w-[960px] px-14 py-0 flex-col items-center'> | |
<div className='flex w-full max-w-[640px] pt-6 pb-8 flex-col grow items-center gap-4'> | |
<div className='relative flex flex-col py-2 items-center gap-[2px] self-stretch'> | |
<div className='flex-grow text-text-primary system-xl-semibold self-stretch'>{t('dataset.connectDataset')}</div> | |
<p className='text-text-tertiary system-sm-regular'> | |
<span>{t('dataset.connectHelper.helper1')}</span> | |
<span className='text-text-secondary system-sm-medium'>{t('dataset.connectHelper.helper2')}</span> | |
<span>{t('dataset.connectHelper.helper3')}</span> | |
<a className='self-stretch text-text-accent system-sm-regular' href='https://docs.dify.ai/guides/knowledge-base/connect-external-knowledge' target='_blank' rel="noopener noreferrer"> | |
{t('dataset.connectHelper.helper4')} | |
</a> | |
<span>{t('dataset.connectHelper.helper5')} </span> | |
</p> | |
<Button | |
className='flex w-8 h-8 p-2 items-center justify-center absolute left-[-44px] top-1 rounded-full' | |
variant='tertiary' | |
onClick={navBackHandle} | |
> | |
<RiArrowLeftLine className='w-4 h-4 text-text-tertiary' /> | |
</Button> | |
</div> | |
<KnowledgeBaseInfo | |
name={formData.name} | |
description={formData.description ?? ''} | |
onChange={data => handleFormChange({ | |
...formData, | |
...data, | |
})} | |
/> | |
<Divider /> | |
<ExternalApiSelection | |
external_knowledge_api_id={formData.external_knowledge_api_id} | |
external_knowledge_id={formData.external_knowledge_id} | |
onChange={data => handleFormChange({ | |
...formData, | |
...data, | |
})} | |
/> | |
<RetrievalSettings | |
topK={formData.external_retrieval_model.top_k} | |
scoreThreshold={formData.external_retrieval_model.score_threshold} | |
scoreThresholdEnabled={formData.external_retrieval_model.score_threshold_enabled} | |
onChange={data => handleFormChange({ | |
...formData, | |
external_retrieval_model: { | |
...formData.external_retrieval_model, | |
...data, | |
}, | |
})} | |
/> | |
<div className='flex py-2 justify-end items-center gap-2 self-stretch'> | |
<Button variant='secondary' onClick={navBackHandle}> | |
<div className='text-components-button-secondary-text system-sm-medium'>{t('dataset.externalKnowledgeForm.cancel')}</div> | |
</Button> | |
<Button | |
variant='primary' | |
onClick={() => { | |
onConnect(formData) | |
}} | |
disabled={!isFormValid} | |
loading={loading} | |
> | |
<div className='text-components-button-primary-text system-sm-medium'>{t('dataset.externalKnowledgeForm.connect')}</div> | |
<RiArrowRightLine className='w-4 h-4 text-components-button-primary-text' /> | |
</Button> | |
</div> | |
</div> | |
</div> | |
<InfoPanel /> | |
</div> | |
</div> | |
) | |
} | |
export default ExternalKnowledgeBaseCreate | |