diff --git a/web/app/(commonLayout)/datasets/Container.tsx b/web/app/(commonLayout)/datasets/Container.tsx index bfe487a52b..2bb94f979a 100644 --- a/web/app/(commonLayout)/datasets/Container.tsx +++ b/web/app/(commonLayout)/datasets/Container.tsx @@ -2,7 +2,7 @@ // Libraries import { useEffect, useMemo, useRef, useState } from 'react' -import { useRouter, useSearchParams } from 'next/navigation' +import { useRouter } from 'next/navigation' import { useTranslation } from 'react-i18next' import { useDebounceFn } from 'ahooks' import useSWR from 'swr' @@ -35,17 +35,6 @@ const Container = () => { const { currentWorkspace } = useAppContext() const showTagManagementModal = useTagStore(s => s.showTagManagementModal) const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel() - const searchParams = useSearchParams() - - useEffect(() => { - const openPanel = searchParams.get('openExternalApiPanel') - if (openPanel === 'true') { - setTimeout(() => { - setShowExternalApiPanel(true) - window.history.replaceState({}, '', '/datasets') - }, 500) - } - }, [searchParams, setShowExternalApiPanel]) const options = useMemo(() => { return [ diff --git a/web/app/(commonLayout)/datasets/DatasetCard.tsx b/web/app/(commonLayout)/datasets/DatasetCard.tsx index fa0625a528..e8ccddbcb7 100644 --- a/web/app/(commonLayout)/datasets/DatasetCard.tsx +++ b/web/app/(commonLayout)/datasets/DatasetCard.tsx @@ -142,7 +142,7 @@ const DatasetCard = ({
{dataset.provider === 'external' ? <> diff --git a/web/app/components/app/configuration/dataset-config/settings-modal/index.tsx b/web/app/components/app/configuration/dataset-config/settings-modal/index.tsx index 05e7b46ced..7b3b4abc0f 100644 --- a/web/app/components/app/configuration/dataset-config/settings-modal/index.tsx +++ b/web/app/components/app/configuration/dataset-config/settings-modal/index.tsx @@ -61,6 +61,7 @@ const SettingsModal: FC = ({ const ref = useRef(null) const [topK, setTopK] = useState(currentDataset?.external_retrieval_model.top_k ?? 2) const [scoreThreshold, setScoreThreshold] = useState(currentDataset?.external_retrieval_model.score_threshold ?? 0.5) + const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(currentDataset?.external_retrieval_model.score_threshold_enabled ?? false) const { setShowAccountSettingModal } = useModalContext() const [loading, setLoading] = useState(false) @@ -78,11 +79,13 @@ const SettingsModal: FC = ({ const [isHideChangedTip, setIsHideChangedTip] = useState(false) const isRetrievalChanged = !isEqual(retrievalConfig, localeCurrentDataset?.retrieval_model_dict) || indexMethod !== localeCurrentDataset?.indexing_technique - const handleSettingsChange = (data: { top_k?: number; score_threshold?: number }) => { + const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => { if (data.top_k !== undefined) setTopK(data.top_k) if (data.score_threshold !== undefined) setScoreThreshold(data.score_threshold) + if (data.score_threshold_enabled !== undefined) + setScoreThresholdEnabled(data.score_threshold_enabled) } const handleSave = async () => { @@ -122,6 +125,7 @@ const SettingsModal: FC = ({ external_retrieval_model: { top_k: topK, score_threshold: scoreThreshold, + score_threshold_enabled: scoreThresholdEnabled, }, retrieval_model: { ...postRetrievalConfig, @@ -287,6 +291,7 @@ const SettingsModal: FC = ({ diff --git a/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx b/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx index 839b2be399..5b76acc936 100644 --- a/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx +++ b/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx @@ -211,7 +211,7 @@ const SegmentCard: FC = ({
-
+
= ({ items, value, onSelect }) => { const { t } = useTranslation() const [isOpen, setIsOpen] = useState(false) - const router = useRouter() const [selectedItem, setSelectedItem] = useState( items.find(item => item.value === value) || null, ) + const { setShowExternalKnowledgeAPIModal } = useModalContext() + const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi() + const router = useRouter() useEffect(() => { const newSelectedItem = items.find(item => item.value === value) || null @@ -33,7 +37,17 @@ const ExternalApiSelect: React.FC = ({ items, value, onS }, [value, items]) const handleAddNewAPI = () => { - router.push('/datasets?openExternalApiPanel=true') + setShowExternalKnowledgeAPIModal({ + payload: { name: '', settings: { endpoint: '', api_key: '' } }, + onSaveCallback: async () => { + mutateExternalKnowledgeApis() + router.refresh() + }, + onCancelCallback: () => { + mutateExternalKnowledgeApis() + }, + isEditMode: false, + }) } const handleSelect = (item: ApiItem) => { @@ -51,7 +65,7 @@ const ExternalApiSelect: React.FC = ({ items, value, onS > {selectedItem ? ( -
+
{selectedItem.name} diff --git a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx index d3a5325d38..c910d9b2a7 100644 --- a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx @@ -7,6 +7,7 @@ import { useRouter } from 'next/navigation' import ExternalApiSelect from './ExternalApiSelect' import Input from '@/app/components/base/input' import Button from '@/app/components/base/button' +import { useModalContext } from '@/context/modal-context' import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' type ExternalApiSelectionProps = { @@ -20,6 +21,8 @@ const ExternalApiSelection: React.FC = ({ external_kn const router = useRouter() const { externalKnowledgeApiList } = useExternalKnowledgeApi() const [selectedApiId, setSelectedApiId] = useState(external_knowledge_api_id) + const { setShowExternalKnowledgeAPIModal } = useModalContext() + const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi() const apiItems = externalKnowledgeApiList.map(api => ({ value: api.id, @@ -37,7 +40,17 @@ const ExternalApiSelection: React.FC = ({ external_kn }, [apiItems, external_knowledge_api_id, external_knowledge_id, onChange]) const handleAddNewAPI = () => { - router.push('/datasets?openExternalApiPanel=true') + setShowExternalKnowledgeAPIModal({ + payload: { name: '', settings: { endpoint: '', api_key: '' } }, + onSaveCallback: async () => { + mutateExternalKnowledgeApis() + router.refresh() + }, + onCancelCallback: () => { + mutateExternalKnowledgeApis() + }, + isEditMode: false, + }) } useEffect(() => { diff --git a/web/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx b/web/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx index ca2f93d7a6..1a2e83d2d6 100644 --- a/web/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx @@ -42,7 +42,7 @@ const KnowledgeBaseInfo: React.FC = ({ name, description value={description} onChange={ e => handleDescriptionChange(e)} placeholder={t('dataset.externalKnowledgeDescriptionPlaceholder') ?? ''} - className={`flex h-20 p-2 self-stretch items-start rounded-lg bg-components-input-bg-normal ${description ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder'} system-sm-regular`} + className={`flex h-20 py-2 p-3 self-stretch items-start rounded-lg bg-components-input-bg-normal ${description ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder'} system-sm-regular`} /> void + onChange: (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => void } -const RetrievalSettings: FC = ({ topK, scoreThreshold, onChange, isInHitTesting = false, isInRetrievalSetting = false }) => { - const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(false) +const RetrievalSettings: FC = ({ + topK, + scoreThreshold, + scoreThresholdEnabled, + onChange, + isInHitTesting = false, + isInRetrievalSetting = false, +}) => { const { t } = useTranslation() + + const handleScoreThresholdChange = (enabled: boolean) => { + onChange({ score_threshold_enabled: enabled }) + } + return (
{!isInHitTesting && !isInRetrievalSetting &&
@@ -44,7 +56,7 @@ const RetrievalSettings: FC = ({ topK, scoreThreshold, o onChange={(_key, v) => onChange({ score_threshold: v })} enable={scoreThresholdEnabled} hasSwitch={true} - onSwitchChange={(_key, v) => setScoreThresholdEnabled(v)} + onSwitchChange={(_key, v) => handleScoreThresholdChange(v)} />
diff --git a/web/app/components/datasets/external-knowledge-base/create/declarations.ts b/web/app/components/datasets/external-knowledge-base/create/declarations.ts index bf16e1d3a9..271caf33df 100644 --- a/web/app/components/datasets/external-knowledge-base/create/declarations.ts +++ b/web/app/components/datasets/external-knowledge-base/create/declarations.ts @@ -7,5 +7,6 @@ export type CreateKnowledgeBaseReq = { external_retrieval_model: { top_k: number score_threshold: number + score_threshold_enabled: boolean } } diff --git a/web/app/components/datasets/external-knowledge-base/create/index.tsx b/web/app/components/datasets/external-knowledge-base/create/index.tsx index 41662ce907..921050e218 100644 --- a/web/app/components/datasets/external-knowledge-base/create/index.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/index.tsx @@ -28,6 +28,7 @@ const ExternalKnowledgeBaseCreate: React.FC = external_retrieval_model: { top_k: 2, score_threshold: 0.5, + score_threshold_enabled: false, }, provider: 'external', @@ -91,6 +92,7 @@ const ExternalKnowledgeBaseCreate: React.FC = handleFormChange({ ...formData, external_retrieval_model: { diff --git a/web/app/components/datasets/hit-testing/hit-detail.tsx b/web/app/components/datasets/hit-testing/hit-detail.tsx index 9d12ff4494..066e2238c8 100644 --- a/web/app/components/datasets/hit-testing/hit-detail.tsx +++ b/web/app/components/datasets/hit-testing/hit-detail.tsx @@ -35,33 +35,31 @@ const HitDetail: FC = ({ segInfo }) => {
{renderContent()}
:
-
-
- -
- - {segInfo?.word_count} {t('datasetDocuments.segment.characters')} - -
- - {segInfo?.hit_count} {t('datasetDocuments.segment.hitCount')} - -
- -
{renderContent()}
-
- {t('datasetDocuments.segment.keywords')} -
-
- {!segInfo?.keywords?.length - ? '-' - : segInfo?.keywords?.map((word, index) => { - return
{word}
- })} -
+
+ +
+ + {segInfo?.word_count} {t('datasetDocuments.segment.characters')} + +
+ + {segInfo?.hit_count} {t('datasetDocuments.segment.hitCount')} + +
+ +
{renderContent()}
+
+ {t('datasetDocuments.segment.keywords')} +
+
+ {!segInfo?.keywords?.length + ? '-' + : segInfo?.keywords?.map((word, index) => { + return
{word}
+ })}
) diff --git a/web/app/components/datasets/hit-testing/index.tsx b/web/app/components/datasets/hit-testing/index.tsx index 2e21c268e4..1aae42e16d 100644 --- a/web/app/components/datasets/hit-testing/index.tsx +++ b/web/app/components/datasets/hit-testing/index.tsx @@ -218,7 +218,7 @@ const HitTesting: FC = ({ datasetId }: Props) => {
{ setCurrParagraph({ showModal: false }) diff --git a/web/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx b/web/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx index 3234a2ae35..fd99c698bb 100644 --- a/web/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx +++ b/web/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx @@ -9,9 +9,10 @@ import ActionButton from '@/app/components/base/action-button' type ModifyExternalRetrievalModalProps = { onClose: () => void - onSave: (data: { top_k: number; score_threshold: number }) => void + onSave: (data: { top_k: number; score_threshold: number; score_threshold_enabled: boolean }) => void initialTopK: number initialScoreThreshold: number + initialScoreThresholdEnabled: boolean } const ModifyExternalRetrievalModal: React.FC = ({ @@ -19,20 +20,24 @@ const ModifyExternalRetrievalModal: React.FC onSave, initialTopK, initialScoreThreshold, + initialScoreThresholdEnabled, }) => { const { t } = useTranslation() const [topK, setTopK] = useState(initialTopK) const [scoreThreshold, setScoreThreshold] = useState(initialScoreThreshold) + const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(initialScoreThresholdEnabled) - const handleSettingsChange = (data: { top_k?: number; score_threshold?: number }) => { + const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => { if (data.top_k !== undefined) setTopK(data.top_k) if (data.score_threshold !== undefined) setScoreThreshold(data.score_threshold) + if (data.score_threshold_enabled !== undefined) + setScoreThresholdEnabled(data.score_threshold_enabled) } const handleSave = () => { - onSave({ top_k: topK, score_threshold: scoreThreshold }) + onSave({ top_k: topK, score_threshold: scoreThreshold, score_threshold_enabled: scoreThresholdEnabled }) onClose() } @@ -50,6 +55,7 @@ const ModifyExternalRetrievalModal: React.FC diff --git a/web/app/components/datasets/hit-testing/textarea.tsx b/web/app/components/datasets/hit-testing/textarea.tsx index 0c5ac18118..5d228dfa36 100644 --- a/web/app/components/datasets/hit-testing/textarea.tsx +++ b/web/app/components/datasets/hit-testing/textarea.tsx @@ -51,9 +51,10 @@ const TextAreaWithButton = ({ const [externalRetrievalSettings, setExternalRetrievalSettings] = useState({ top_k: 2, score_threshold: 0.5, + score_threshold_enabled: false, }) - const handleSaveExternalRetrievalSettings = (data: { top_k: number; score_threshold: number }) => { + const handleSaveExternalRetrievalSettings = (data: { top_k: number; score_threshold: number; score_threshold_enabled: boolean }) => { setExternalRetrievalSettings(data) setIsSettingsOpen(false) } @@ -90,6 +91,7 @@ const TextAreaWithButton = ({ external_retrieval_model: { top_k: externalRetrievalSettings.top_k, score_threshold: externalRetrievalSettings.score_threshold, + score_threshold_enabled: externalRetrievalSettings.score_threshold_enabled, }, }) as Promise, ) diff --git a/web/app/components/datasets/settings/form/index.tsx b/web/app/components/datasets/settings/form/index.tsx index 243f00290e..ed0865f871 100644 --- a/web/app/components/datasets/settings/form/index.tsx +++ b/web/app/components/datasets/settings/form/index.tsx @@ -60,6 +60,7 @@ const Form = () => { const [permission, setPermission] = useState(currentDataset?.permission) const [topK, setTopK] = useState(currentDataset?.external_retrieval_model.top_k ?? 2) const [scoreThreshold, setScoreThreshold] = useState(currentDataset?.external_retrieval_model.score_threshold ?? 0.5) + const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(currentDataset?.external_retrieval_model.score_threshold_enabled ?? false) const [selectedMemberIDs, setSelectedMemberIDs] = useState(currentDataset?.partial_member_list || []) const [memberList, setMemberList] = useState([]) const [indexMethod, setIndexMethod] = useState(currentDataset?.indexing_technique) @@ -90,11 +91,13 @@ const Form = () => { setMemberList(accounts) } - const handleSettingsChange = (data: { top_k?: number; score_threshold?: number }) => { + const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => { if (data.top_k !== undefined) setTopK(data.top_k) if (data.score_threshold !== undefined) setScoreThreshold(data.score_threshold) + if (data.score_threshold_enabled !== undefined) + setScoreThresholdEnabled(data.score_threshold_enabled) } useMount(() => { @@ -141,6 +144,7 @@ const Form = () => { external_retrieval_model: { top_k: topK, score_threshold: scoreThreshold, + score_threshold_enabled: scoreThresholdEnabled, }, retrieval_model: { ...postRetrievalConfig, @@ -268,6 +272,7 @@ const Form = () => { diff --git a/web/models/datasets.ts b/web/models/datasets.ts index 9930728df9..7f52ad6b0f 100644 --- a/web/models/datasets.ts +++ b/web/models/datasets.ts @@ -42,6 +42,7 @@ export type DataSet = { external_retrieval_model: { top_k: number score_threshold: number + score_threshold_enabled: boolean } } diff --git a/web/service/datasets.ts b/web/service/datasets.ts index 68daf80fe4..efc483a62f 100644 --- a/web/service/datasets.ts +++ b/web/service/datasets.ts @@ -245,7 +245,7 @@ export const hitTesting: Fetcher(`/datasets/${datasetId}/hit-testing`, { body: { query: queryText, retrieval_model } }) } -export const externalKnowledgeBaseHitTesting: Fetcher = ({ datasetId, query, external_retrieval_model }) => { +export const externalKnowledgeBaseHitTesting: Fetcher = ({ datasetId, query, external_retrieval_model }) => { return post(`/datasets/${datasetId}/external-hit-testing`, { body: { query, external_retrieval_model } }) }