perf: api dataset code

This commit is contained in:
archer
2025-06-03 18:31:35 +08:00
parent 2507997d20
commit e32ca8a3e9
63 changed files with 347 additions and 530 deletions

View File

@@ -6,7 +6,7 @@ import type {
APIFileServer,
FeishuServer,
YuqueServer
} from '@fastgpt/global/core/dataset/apiDataset';
} from '@fastgpt/global/core/dataset/apiDataset/type';
import type {
DatasetSearchModeEnum,
DatasetTypeEnum
@@ -17,6 +17,7 @@ import {
TrainingModeEnum
} from '@fastgpt/global/core/dataset/constants';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import type { ApiDatasetServerType } from '@fastgpt/global/core/dataset/apiDataset/type';
import { DatasetDataIndexItemType } from '@fastgpt/global/core/dataset/type';
import type { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import { PermissionValueType } from '@fastgpt/global/support/permission/type';
@@ -31,9 +32,7 @@ export type CreateDatasetParams = {
vectorModel?: string;
agentModel?: string;
vlmModel?: string;
apiServer?: APIFileServer;
feishuServer?: FeishuServer;
yuqueServer?: YuqueServer;
apiDatasetServer?: ApiDatasetServerType;
};
export type RebuildEmbeddingProps = {

View File

@@ -3,11 +3,6 @@ import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { Flex, Input, Button, ModalBody, ModalFooter, Box } from '@chakra-ui/react';
import type { UseFormReturn } from 'react-hook-form';
import { useTranslation } from 'next-i18next';
import type {
APIFileServer,
FeishuServer,
YuqueServer
} from '@fastgpt/global/core/dataset/apiDataset';
import { getApiDatasetPaths, getApiDatasetCatalog } from '@/web/core/dataset/api';
import type {
GetResourceFolderListItemResponse,
@@ -22,6 +17,7 @@ import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
import MyModal from '@fastgpt/web/components/common/MyModal';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { FolderIcon } from '@fastgpt/global/common/file/image/constants';
import type { ApiDatasetServerType } from '@fastgpt/global/core/dataset/apiDataset/type';
const ApiDatasetForm = ({
type,
@@ -32,9 +28,7 @@ const ApiDatasetForm = ({
datasetId?: string;
form: UseFormReturn<
{
apiServer?: APIFileServer;
feishuServer?: FeishuServer;
yuqueServer?: YuqueServer;
apiDatasetServer?: ApiDatasetServerType;
},
any
>;
@@ -42,9 +36,10 @@ const ApiDatasetForm = ({
const { t } = useTranslation();
const { register, setValue, watch } = form;
const yuqueServer = watch('yuqueServer');
const feishuServer = watch('feishuServer');
const apiServer = watch('apiServer');
const apiDatasetServer = watch('apiDatasetServer');
const yuqueServer = apiDatasetServer?.yuqueServer;
const feishuServer = apiDatasetServer?.feishuServer;
const apiServer = apiDatasetServer?.apiServer;
const [pathNames, setPathNames] = useState(t('dataset:rootdirectory'));
const [
@@ -91,9 +86,7 @@ const ApiDatasetForm = ({
const path = await getApiDatasetPaths({
datasetId,
parentId,
yuqueServer,
feishuServer,
apiServer
apiDatasetServer
});
setPathNames(path);
},
@@ -108,13 +101,13 @@ const ApiDatasetForm = ({
const value = id === 'root' || id === null || id === undefined ? '' : id;
switch (type) {
case DatasetTypeEnum.yuque:
setValue('yuqueServer.basePath', value);
setValue('apiDatasetServer.yuqueServer.basePath', value);
break;
case DatasetTypeEnum.feishu:
setValue('feishuServer.folderToken', value);
setValue('apiDatasetServer.feishuServer.folderToken', value);
break;
case DatasetTypeEnum.apiDataset:
setValue('apiServer.basePath', value);
setValue('apiDatasetServer.apiServer.basePath', value);
break;
}
@@ -147,32 +140,10 @@ const ApiDatasetForm = ({
<BaseUrlSelector
selectId={yuqueServer?.basePath || apiServer?.basePath || 'root'}
server={async (e: GetResourceFolderListProps) => {
const params: GetApiDatasetCataLogProps = { parentId: e.parentId };
switch (type) {
case DatasetTypeEnum.yuque:
params.yuqueServer = {
userId: yuqueServer?.userId || '',
token: yuqueServer?.token || '',
basePath: ''
};
break;
// Currently, only Yuque is using it
case DatasetTypeEnum.feishu:
params.feishuServer = {
appId: feishuServer?.appId || '',
appSecret: feishuServer?.appSecret || '',
folderToken: feishuServer?.folderToken || ''
};
break;
case DatasetTypeEnum.apiDataset:
params.apiServer = {
baseUrl: apiServer?.baseUrl || '',
authorization: apiServer?.authorization || '',
basePath: ''
};
break;
}
const params: GetApiDatasetCataLogProps = {
parentId: e.parentId,
apiDatasetServer
};
return getApiDatasetCatalog(params);
}}
@@ -193,7 +164,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={t('dataset:api_url')}
maxLength={200}
{...register('apiServer.baseUrl', { required: true })}
{...register('apiDatasetServer.apiServer.baseUrl', { required: true })}
/>
</Flex>
<Flex mt={6} alignItems={'center'}>
@@ -204,7 +175,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={t('dataset:request_headers')}
maxLength={2000}
{...register('apiServer.authorization')}
{...register('apiDatasetServer.apiServer.authorization')}
/>
</Flex>
{renderBaseUrlSelector()}
@@ -227,7 +198,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={'App ID'}
maxLength={200}
{...register('feishuServer.appId', { required: true })}
{...register('apiDatasetServer.feishuServer.appId', { required: true })}
/>
</Flex>
<Flex mt={6}>
@@ -244,7 +215,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={'App Secret'}
maxLength={200}
{...register('feishuServer.appSecret', { required: true })}
{...register('apiDatasetServer.feishuServer.appSecret', { required: true })}
/>
</Flex>
<Flex mt={6}>
@@ -261,7 +232,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={'Folder Token'}
maxLength={200}
{...register('feishuServer.folderToken', { required: true })}
{...register('apiDatasetServer.feishuServer.folderToken', { required: true })}
/>
</Flex>
{/* {renderBaseUrlSelector()}
@@ -278,7 +249,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={'User ID'}
maxLength={200}
{...register('yuqueServer.userId', { required: true })}
{...register('apiDatasetServer.yuqueServer.userId', { required: true })}
/>
</Flex>
<Flex mt={6} alignItems={'center'}>
@@ -289,7 +260,7 @@ const ApiDatasetForm = ({
bg={'myWhite.600'}
placeholder={'Token'}
maxLength={200}
{...register('yuqueServer.token', { required: true })}
{...register('apiDatasetServer.yuqueServer.token', { required: true })}
/>
</Flex>
{renderBaseUrlSelector()}

View File

@@ -17,7 +17,8 @@ import {
DatasetCollectionTypeEnum,
DatasetTypeEnum,
DatasetTypeMap,
DatasetStatusEnum
DatasetStatusEnum,
ApiDatasetTypeMap
} from '@fastgpt/global/core/dataset/constants';
import EditFolderModal, { useEditFolder } from '../../EditFolderModal';
import { TabEnum } from '../../../../pages/dataset/detail/index';
@@ -435,9 +436,7 @@ const Header = ({ hasTrainingData }: { hasTrainingData: boolean }) => {
/>
)}
{/* apiDataset */}
{(datasetDetail?.type === DatasetTypeEnum.apiDataset ||
datasetDetail?.type === DatasetTypeEnum.feishu ||
datasetDetail?.type === DatasetTypeEnum.yuque) && (
{datasetDetail?.type && ApiDatasetTypeMap[datasetDetail.type] && (
<Flex
px={3.5}
py={2}

View File

@@ -13,7 +13,7 @@ import { type ParentTreePathItemType } from '@fastgpt/global/common/parentFolder
import FolderPath from '@/components/common/folder/Path';
import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils';
import MyBox from '@fastgpt/web/components/common/MyBox';
import { type APIFileItem } from '@fastgpt/global/core/dataset/apiDataset';
import { type APIFileItem } from '@fastgpt/global/core/dataset/apiDataset/type';
import SearchInput from '@fastgpt/web/components/common/Input/SearchInput';
import { useMount } from 'ahooks';

View File

@@ -5,23 +5,17 @@ import { useTranslation } from 'next-i18next';
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
import { useForm } from 'react-hook-form';
import { useToast } from '@fastgpt/web/hooks/useToast';
import {
type APIFileServer,
type FeishuServer,
type YuqueServer
} from '@fastgpt/global/core/dataset/apiDataset';
import ApiDatasetForm from '@/pageComponents/dataset/ApiDatasetForm';
import { useContextSelector } from 'use-context-selector';
import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext';
import { datasetTypeCourseMap } from '@/web/core/dataset/constants';
import { getDocPath } from '@/web/common/system/doc';
import MyIcon from '@fastgpt/web/components/common/Icon';
import type { ApiDatasetServerType } from '@fastgpt/global/core/dataset/apiDataset/type';
import { DatasetTypeMap } from '@fastgpt/global/core/dataset/constants';
export type EditAPIDatasetInfoFormType = {
id: string;
apiServer?: APIFileServer;
yuqueServer?: YuqueServer;
feishuServer?: FeishuServer;
apiDatasetServer?: ApiDatasetServerType;
};
const EditAPIDatasetInfoModal = ({
@@ -60,7 +54,7 @@ const EditAPIDatasetInfoModal = ({
return (
<MyModal isOpen onClose={onClose} w={'450px'} iconSrc="modal/edit" title={title}>
<ModalBody>
{datasetTypeCourseMap[type] && (
{DatasetTypeMap[type]?.courseUrl && (
<Flex alignItems={'center'} justifyContent={'space-between'}>
<Box color={'myGray.900'} fontSize={'sm'} fontWeight={500}>
{t('dataset:apidataset_configuration')}
@@ -71,7 +65,7 @@ const EditAPIDatasetInfoModal = ({
color={'primary.600'}
fontSize={'sm'}
cursor={'pointer'}
onClick={() => window.open(getDocPath(datasetTypeCourseMap[type]), '_blank')}
onClick={() => window.open(getDocPath(DatasetTypeMap[type].courseUrl!), '_blank')}
>
<MyIcon name={'book'} w={4} mr={0.5} />
{t('common:Instructions')}

View File

@@ -311,12 +311,12 @@ const Info = ({ datasetId }: { datasetId: string }) => {
onClick={() =>
setEditedAPIDataset({
id: datasetDetail._id,
apiServer: datasetDetail.apiServer
apiDatasetServer: datasetDetail.apiDatasetServer
})
}
/>
</Flex>
<Box fontSize={'mini'}>{datasetDetail.apiServer?.baseUrl}</Box>
<Box fontSize={'mini'}>{datasetDetail.apiDatasetServer?.apiServer?.baseUrl}</Box>
</Box>
</>
)}
@@ -336,12 +336,12 @@ const Info = ({ datasetId }: { datasetId: string }) => {
onClick={() =>
setEditedAPIDataset({
id: datasetDetail._id,
yuqueServer: datasetDetail.yuqueServer
apiDatasetServer: datasetDetail.apiDatasetServer
})
}
/>
</Flex>
<Box fontSize={'mini'}>{datasetDetail.yuqueServer?.userId}</Box>
<Box fontSize={'mini'}>{datasetDetail.apiDatasetServer?.yuqueServer?.userId}</Box>
</Box>
</>
)}
@@ -361,12 +361,14 @@ const Info = ({ datasetId }: { datasetId: string }) => {
onClick={() =>
setEditedAPIDataset({
id: datasetDetail._id,
feishuServer: datasetDetail.feishuServer
apiDatasetServer: datasetDetail.apiDatasetServer
})
}
/>
</Flex>
<Box fontSize={'mini'}>{datasetDetail.feishuServer?.folderToken}</Box>
<Box fontSize={'mini'}>
{datasetDetail.apiDatasetServer?.feishuServer?.folderToken}
</Box>
</Box>
</>
)}
@@ -435,9 +437,7 @@ const Info = ({ datasetId }: { datasetId: string }) => {
onEdit={(data) =>
updateDataset({
id: datasetId,
apiServer: data.apiServer,
yuqueServer: data.yuqueServer,
feishuServer: data.feishuServer
apiDatasetServer: data.apiDatasetServer
})
}
/>

View File

@@ -11,14 +11,13 @@ import MyModal from '@fastgpt/web/components/common/MyModal';
import { postCreateDataset } from '@/web/core/dataset/api';
import type { CreateDatasetParams } from '@/global/core/dataset/api.d';
import { useTranslation } from 'next-i18next';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants';
import AIModelSelector from '@/components/Select/AIModelSelector';
import { useSystem } from '@fastgpt/web/hooks/useSystem';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import ComplianceTip from '@/components/common/ComplianceTip/index';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { getDocPath } from '@/web/common/system/doc';
import { datasetTypeCourseMap } from '@/web/core/dataset/constants';
import ApiDatasetForm from '../ApiDatasetForm';
import { getWebDefaultEmbeddingModel, getWebDefaultLLMModel } from '@/web/common/system/utils';
@@ -43,31 +42,6 @@ const CreateModal = ({
const { defaultModels, embeddingModelList, datasetModelList, getVlmModelList } = useSystemStore();
const { isPc } = useSystem();
const datasetTypeMap = useMemo(() => {
return {
[DatasetTypeEnum.dataset]: {
name: t('dataset:common_dataset'),
icon: 'core/dataset/commonDatasetColor'
},
[DatasetTypeEnum.websiteDataset]: {
name: t('dataset:website_dataset'),
icon: 'core/dataset/websiteDatasetColor'
},
[DatasetTypeEnum.apiDataset]: {
name: t('dataset:api_file'),
icon: 'core/dataset/externalDatasetColor'
},
[DatasetTypeEnum.feishu]: {
name: t('dataset:feishu_dataset'),
icon: 'core/dataset/feishuDatasetColor'
},
[DatasetTypeEnum.yuque]: {
name: t('dataset:yuque_dataset'),
icon: 'core/dataset/yuqueDatasetColor'
}
};
}, [t]);
const filterNotHiddenVectorModelList = embeddingModelList.filter((item) => !item.hidden);
const vllmModelList = useMemo(() => getVlmModelList(), [getVlmModelList]);
@@ -76,7 +50,7 @@ const CreateModal = ({
defaultValues: {
parentId,
type: type || DatasetTypeEnum.dataset,
avatar: datasetTypeMap[type].icon,
avatar: DatasetTypeMap[type].icon,
name: '',
intro: '',
vectorModel:
@@ -121,10 +95,10 @@ const CreateModal = ({
w={'20px'}
h={'20px'}
borderRadius={'xs'}
src={datasetTypeMap[type].icon}
src={DatasetTypeMap[type].icon}
pr={'10px'}
/>
{t('common:core.dataset.Create dataset', { name: datasetTypeMap[type].name })}
{t('common:core.dataset.Create dataset', { name: t(DatasetTypeMap[type].label) })}
</Flex>
}
isOpen
@@ -138,14 +112,14 @@ const CreateModal = ({
<Box color={'myGray.900'} fontWeight={500} fontSize={'sm'}>
{t('common:input_name')}
</Box>
{datasetTypeCourseMap[type] && (
{DatasetTypeMap[type]?.courseUrl && (
<Flex
as={'span'}
alignItems={'center'}
color={'primary.600'}
fontSize={'sm'}
cursor={'pointer'}
onClick={() => window.open(getDocPath(datasetTypeCourseMap[type]), '_blank')}
onClick={() => window.open(getDocPath(DatasetTypeMap[type].courseUrl!), '_blank')}
>
<MyIcon name={'book'} w={4} mr={0.5} />
{t('common:Instructions')}

View File

@@ -1,41 +1,14 @@
import { Box, Flex, type FlexProps } from '@chakra-ui/react';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants';
import MyIcon from '@fastgpt/web/components/common/Icon';
import React, { useMemo } from 'react';
import React from 'react';
import { useTranslation } from 'next-i18next';
const SideTag = ({ type, ...props }: { type: `${DatasetTypeEnum}` } & FlexProps) => {
if (type === DatasetTypeEnum.folder) return null;
const { t } = useTranslation();
const DatasetListTypeMap = useMemo(() => {
return {
[DatasetTypeEnum.dataset]: {
icon: 'core/dataset/commonDatasetOutline',
label: t('dataset:common_dataset')
},
[DatasetTypeEnum.websiteDataset]: {
icon: 'core/dataset/websiteDatasetOutline',
label: t('dataset:website_dataset')
},
[DatasetTypeEnum.externalFile]: {
icon: 'core/dataset/externalDatasetOutline',
label: t('dataset:external_file')
},
[DatasetTypeEnum.apiDataset]: {
icon: 'core/dataset/externalDatasetOutline',
label: t('dataset:api_file')
},
[DatasetTypeEnum.feishu]: {
icon: 'core/dataset/feishuDatasetOutline',
label: t('dataset:feishu_dataset')
},
[DatasetTypeEnum.yuque]: {
icon: 'core/dataset/yuqueDatasetOutline',
label: t('dataset:yuque_dataset')
}
};
}, [t]);
const item = DatasetListTypeMap[type] || DatasetListTypeMap['dataset'];
const item = DatasetTypeMap[type] || DatasetTypeMap['dataset'];
return (
<Flex
@@ -50,7 +23,7 @@ const SideTag = ({ type, ...props }: { type: `${DatasetTypeEnum}` } & FlexProps)
>
<MyIcon name={item.icon as any} w={'0.8rem'} color={'myGray.400'} />
<Box fontSize={'mini'} ml={1}>
{item.label}
{t(item.label)}
</Box>
</Flex>
);

View File

@@ -0,0 +1,38 @@
import { NextAPI } from '@/service/middleware/entry';
import { authCert } from '@fastgpt/service/support/permission/auth/common';
import { type NextApiRequest, type NextApiResponse } from 'next';
import { MongoDataset } from '@fastgpt/service/core/dataset/schema';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
async function handler(req: NextApiRequest, _res: NextApiResponse) {
await authCert({ req, authRoot: true });
console.log('更新所有 API 知识库');
const datasets = await MongoDataset.find({
type: {
$in: [DatasetTypeEnum.apiDataset, DatasetTypeEnum.feishu, DatasetTypeEnum.yuque]
}
}).lean();
for (const dataset of datasets) {
console.log(dataset._id);
await MongoDataset.updateOne(
{ _id: dataset._id },
{
$set: {
apiDatasetServer: {
...(dataset.apiServer && { apiServer: dataset.apiServer }),
...(dataset.feishuServer && { feishuServer: dataset.feishuServer }),
...(dataset.yuqueServer && { yuqueServer: dataset.yuqueServer })
}
}
}
);
}
return { success: true };
}
export default NextAPI(handler);

View File

@@ -1,35 +1,34 @@
import { getApiDatasetRequest } from '@fastgpt/service/core/dataset/apiDataset';
import { NextAPI } from '@/service/middleware/entry';
import type { ParentIdType } from '@fastgpt/global/common/parentFolder/type';
import type {
APIFileItem,
APIFileServer,
YuqueServer,
FeishuServer
} from '@fastgpt/global/core/dataset/apiDataset';
import { type NextApiRequest } from 'next';
import { authCert } from '@fastgpt/service/support/permission/auth/common';
import type {
ApiDatasetServerType,
APIFileItem
} from '@fastgpt/global/core/dataset/apiDataset/type';
export type GetApiDatasetCataLogProps = {
parentId?: ParentIdType;
yuqueServer?: YuqueServer;
feishuServer?: FeishuServer;
apiServer?: APIFileServer;
apiDatasetServer?: ApiDatasetServerType;
};
export type GetApiDatasetCataLogResponse = APIFileItem[];
async function handler(req: NextApiRequest) {
let { searchKey = '', parentId = null, yuqueServer, feishuServer, apiServer } = req.body;
let { searchKey = '', parentId = null, apiDatasetServer } = req.body;
await authCert({ req, authToken: true });
// Remove basePath from apiDatasetServer
Object.values(apiDatasetServer).forEach((server: any) => {
if (server.basePath) {
delete server.basePath;
}
});
const data = await (
await getApiDatasetRequest({
feishuServer,
yuqueServer,
apiServer
})
await getApiDatasetRequest(apiDatasetServer)
).listFiles({ parentId, searchKey });
return data?.filter((item: APIFileItem) => item.hasChild === true) || [];

View File

@@ -2,11 +2,9 @@ import { NextAPI } from '@/service/middleware/entry';
import { DatasetErrEnum } from '@fastgpt/global/common/error/code/dataset';
import type { ParentIdType } from '@fastgpt/global/common/parentFolder/type';
import type {
APIFileServer,
YuqueServer,
FeishuServer,
ApiDatasetDetailResponse
} from '@fastgpt/global/core/dataset/apiDataset';
ApiDatasetDetailResponse,
ApiDatasetServerType
} from '@fastgpt/global/core/dataset/apiDataset/type';
import { getApiDatasetRequest } from '@fastgpt/service/core/dataset/apiDataset';
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
import { authCert } from '@fastgpt/service/support/permission/auth/common';
@@ -18,9 +16,7 @@ export type GetApiDatasetPathQuery = {};
export type GetApiDatasetPathBody = {
datasetId?: string;
parentId?: ParentIdType;
yuqueServer?: YuqueServer;
feishuServer?: FeishuServer;
apiServer?: APIFileServer;
apiDatasetServer?: ApiDatasetServerType;
};
export type GetApiDatasetPathResponse = string;
@@ -50,7 +46,7 @@ async function handler(
const { datasetId, parentId } = req.body;
if (!parentId) return '';
const { yuqueServer, feishuServer, apiServer } = await (async () => {
const apiDatasetServer = await (async () => {
if (datasetId) {
const { dataset } = await authDataset({
req,
@@ -60,49 +56,21 @@ async function handler(
datasetId
});
return {
yuqueServer: req.body.yuqueServer
? { ...req.body.yuqueServer, token: dataset.yuqueServer?.token ?? '' }
: dataset.yuqueServer,
feishuServer: req.body.feishuServer
? { ...req.body.feishuServer, appSecret: dataset.feishuServer?.appSecret ?? '' }
: dataset.feishuServer,
apiServer: req.body.apiServer
? {
...req.body.apiServer,
authorization: dataset.apiServer?.authorization ?? ''
}
: dataset.apiServer
};
return dataset.apiDatasetServer;
} else {
await authCert({ req, authToken: true });
return {
yuqueServer: req.body.yuqueServer,
feishuServer: req.body.feishuServer,
apiServer: req.body.apiServer
};
return req.body.apiDatasetServer;
}
})();
if (feishuServer) {
return '';
const apiDataset = await getApiDatasetRequest(apiDatasetServer);
if (!apiDataset?.getFileDetail) {
return Promise.reject(DatasetErrEnum.noApiServer);
}
if (yuqueServer || apiServer) {
const apiDataset = await getApiDatasetRequest({
yuqueServer,
apiServer
});
if (!apiDataset?.getFileDetail) {
return Promise.reject(DatasetErrEnum.noApiServer);
}
return await getFullPath(parentId, apiDataset.getFileDetail);
}
return Promise.reject(new Error(DatasetErrEnum.noApiServer));
return await getFullPath(parentId, apiDataset.getFileDetail);
}
export default NextAPI(handler);

View File

@@ -23,17 +23,7 @@ async function handler(req: NextApiRequest) {
per: ReadPermissionVal
});
const apiServer = dataset.apiServer;
const feishuServer = dataset.feishuServer;
const yuqueServer = dataset.yuqueServer;
return (
await getApiDatasetRequest({
apiServer,
yuqueServer,
feishuServer
})
).listFiles({ searchKey, parentId });
return (await getApiDatasetRequest(dataset.apiDatasetServer)).listFiles({ searchKey, parentId });
}
export default NextAPI(handler);

View File

@@ -23,10 +23,6 @@ async function handler(req: NextApiRequest): CreateCollectionResponse {
per: WritePermissionVal
});
const apiServer = dataset.apiServer;
const feishuServer = dataset.feishuServer;
const yuqueServer = dataset.yuqueServer;
// Auth same apiFileId
const storeCol = await MongoDatasetCollection.findOne(
{
@@ -42,9 +38,7 @@ async function handler(req: NextApiRequest): CreateCollectionResponse {
}
const { title, rawText } = await readApiServerFileContent({
apiServer,
feishuServer,
yuqueServer,
apiDatasetServer: dataset.apiDatasetServer,
apiFileId,
teamId,
tmbId,

View File

@@ -62,9 +62,7 @@ async function handler(
return {
type: DatasetSourceReadTypeEnum.apiFile,
sourceId: collection.apiFileId,
apiServer: collection.dataset.apiServer,
feishuServer: collection.dataset.feishuServer,
yuqueServer: collection.dataset.yuqueServer
apiDatasetServer: collection.dataset.apiDatasetServer
};
}
if (collection.type === DatasetCollectionTypeEnum.externalFile) {

View File

@@ -94,17 +94,7 @@ async function handler(
return collection.rawLink;
}
if (collection.type === DatasetCollectionTypeEnum.apiFile && collection.apiFileId) {
const apiServer = collection.dataset.apiServer;
const feishuServer = collection.dataset.feishuServer;
const yuqueServer = collection.dataset.yuqueServer;
return (
await getApiDatasetRequest({
apiServer,
feishuServer,
yuqueServer
})
).getFilePreviewUrl({
return (await getApiDatasetRequest(collection.dataset.apiDatasetServer)).getFilePreviewUrl({
apiFileId: collection.apiFileId
});
}

View File

@@ -38,9 +38,7 @@ async function handler(
vectorModel = getDefaultEmbeddingModel()?.model,
agentModel = getDatasetModel()?.model,
vlmModel,
apiServer,
feishuServer,
yuqueServer
apiDatasetServer
} = req.body;
// auth
@@ -86,9 +84,7 @@ async function handler(
vlmModel,
avatar,
type,
apiServer,
feishuServer,
yuqueServer
apiDatasetServer
}
],
{ session, ordered: true }

View File

@@ -7,6 +7,7 @@ import { type ApiRequestProps } from '@fastgpt/service/type/next';
import { CommonErrEnum } from '@fastgpt/global/common/error/code/common';
import { getWebsiteSyncDatasetStatus } from '@fastgpt/service/core/dataset/websiteSync';
import { DatasetStatusEnum, DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { filterApiDatasetServerPublicData } from '@fastgpt/global/core/dataset/apiDataset/utils';
type Query = {
id: string;
@@ -40,36 +41,16 @@ async function handler(req: ApiRequestProps<Query>): Promise<DatasetItemType> {
errorMsg: undefined
};
})();
console.log(filterApiDatasetServerPublicData(dataset.apiDatasetServer));
return {
...dataset,
status,
errorMsg,
apiServer: dataset.apiServer
? {
baseUrl: dataset.apiServer.baseUrl,
authorization: '',
basePath: dataset.apiServer.basePath
}
: undefined,
yuqueServer: dataset.yuqueServer
? {
userId: dataset.yuqueServer.userId,
token: '',
basePath: dataset.yuqueServer.basePath
}
: undefined,
feishuServer: dataset.feishuServer
? {
appId: dataset.feishuServer.appId,
appSecret: '',
folderToken: dataset.feishuServer.folderToken
}
: undefined,
permission,
vectorModel: getEmbeddingModel(dataset.vectorModel),
agentModel: getLLMModel(dataset.agentModel),
vlmModel: getVlmModel(dataset.vlmModel)
vlmModel: getVlmModel(dataset.vlmModel),
apiDatasetServer: filterApiDatasetServerPublicData(dataset.apiDatasetServer)
};
}

View File

@@ -121,11 +121,9 @@ async function handler(
type,
sourceId,
selector,
apiServer: dataset.apiServer,
feishuServer: dataset.feishuServer,
yuqueServer: dataset.yuqueServer,
externalFileId,
customPdfParse
customPdfParse,
apiDatasetServer: dataset.apiDatasetServer
});
const chunks = rawText2Chunks({

View File

@@ -69,9 +69,7 @@ async function handler(
vlmModel,
websiteConfig,
externalReadUrl,
apiServer,
yuqueServer,
feishuServer,
apiDatasetServer,
autoSync,
chunkSettings
} = req.body;
@@ -168,6 +166,37 @@ async function handler(
await delDatasetRelevantData({ datasets: [dataset], session });
}
const apiDatasetParams = (() => {
if (!apiDatasetServer) return {};
const flattenObjectWithConditions = (
obj: any,
prefix = 'apiDatasetServer'
): Record<string, any> => {
const result: Record<string, any> = {};
if (!obj || typeof obj !== 'object') return result;
Object.keys(obj).forEach((key) => {
const value = obj[key];
const newKey = prefix ? `${prefix}.${key}` : key;
if (value) {
if (typeof value === 'object' && !Array.isArray(value)) {
// Recursively flatten nested objects
Object.assign(result, flattenObjectWithConditions(value, newKey));
} else {
// Add non-empty primitive values
result[newKey] = value;
}
}
});
return result;
};
return flattenObjectWithConditions(apiDatasetServer);
})();
await MongoDataset.findByIdAndUpdate(
id,
{
@@ -180,23 +209,9 @@ async function handler(
...(chunkSettings && { chunkSettings }),
...(intro !== undefined && { intro }),
...(externalReadUrl !== undefined && { externalReadUrl }),
...(!!apiServer?.baseUrl && { 'apiServer.baseUrl': apiServer.baseUrl }),
...(!!apiServer?.authorization && {
'apiServer.authorization': apiServer.authorization
}),
...(!!apiServer?.basePath !== undefined && { 'apiServer.basePath': apiServer?.basePath }),
...(!!yuqueServer?.userId && { 'yuqueServer.userId': yuqueServer.userId }),
...(!!yuqueServer?.token && { 'yuqueServer.token': yuqueServer.token }),
...(!!yuqueServer?.basePath !== undefined && {
'yuqueServer.basePath': yuqueServer?.basePath
}),
...(!!feishuServer?.appId && { 'feishuServer.appId': feishuServer.appId }),
...(!!feishuServer?.appSecret && { 'feishuServer.appSecret': feishuServer.appSecret }),
...(!!feishuServer?.folderToken && {
'feishuServer.folderToken': feishuServer.folderToken
}),
...(isMove && { inheritPermission: true }),
...(typeof autoSync === 'boolean' && { autoSync })
...(typeof autoSync === 'boolean' && { autoSync }),
...apiDatasetParams
},
{ session }
);

View File

@@ -69,7 +69,7 @@ import type {
getTrainingErrorBody,
getTrainingErrorResponse
} from '@/pages/api/core/dataset/training/getTrainingError';
import type { APIFileItem } from '@fastgpt/global/core/dataset/apiDataset';
import type { APIFileItem } from '@fastgpt/global/core/dataset/apiDataset/type';
import type { GetQuoteDataProps } from '@/pages/api/core/dataset/data/getQuoteData';
import type {
GetApiDatasetCataLogResponse,

View File

@@ -2,8 +2,7 @@ import { defaultQAModels, defaultVectorModels } from '@fastgpt/global/core/ai/mo
import {
DatasetCollectionDataProcessModeEnum,
DatasetCollectionTypeEnum,
DatasetTypeEnum,
TrainingModeEnum
DatasetTypeEnum
} from '@fastgpt/global/core/dataset/constants';
import type {
DatasetCollectionItemType,
@@ -66,16 +65,6 @@ export const defaultCollectionDetail: DatasetCollectionItemType = {
indexAmount: 0
};
export const datasetTypeCourseMap: Record<`${DatasetTypeEnum}`, string> = {
[DatasetTypeEnum.folder]: '',
[DatasetTypeEnum.dataset]: '',
[DatasetTypeEnum.apiDataset]: '/docs/guide/knowledge_base/api_dataset/',
[DatasetTypeEnum.websiteDataset]: '/docs/guide/knowledge_base/websync/',
[DatasetTypeEnum.feishu]: '/docs/guide/knowledge_base/lark_dataset/',
[DatasetTypeEnum.yuque]: '/docs/guide/knowledge_base/yuque_dataset/',
[DatasetTypeEnum.externalFile]: ''
};
export const TrainingProcess = {
waiting: {
label: i18nT('dataset:process.Waiting'),

View File

@@ -18,6 +18,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import { type ParentTreePathItemType } from '@fastgpt/global/common/parentFolder/type';
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
import { getWebLLMModel } from '@/web/common/system/utils';
import { filterApiDatasetServerPublicData } from '@fastgpt/global/core/dataset/apiDataset/utils';
type DatasetPageContextType = {
datasetId: string;
@@ -103,27 +104,7 @@ export const DatasetPageContextProvider = ({
...data,
agentModel: data.agentModel ? getWebLLMModel(data.agentModel) : state.agentModel,
vlmModel: data.vlmModel ? getWebLLMModel(data.vlmModel) : state.vlmModel,
apiServer: data.apiServer
? {
baseUrl: data.apiServer.baseUrl,
authorization: '',
basePath: data.apiServer.basePath
}
: state.apiServer,
yuqueServer: data.yuqueServer
? {
userId: data.yuqueServer.userId,
token: '',
basePath: data.yuqueServer.basePath
}
: state.yuqueServer,
feishuServer: data.feishuServer
? {
appId: data.feishuServer.appId,
appSecret: '',
folderToken: data.feishuServer.folderToken
}
: state.feishuServer
apiDatasetServer: filterApiDatasetServerPublicData(data.apiDatasetServer)
}));
}
};

View File

@@ -2,7 +2,7 @@ import type { PushDatasetDataChunkProps } from '@fastgpt/global/core/dataset/api
import type { TrainingModeEnum } from '@fastgpt/global/core/dataset/constants';
import type { ChunkSettingModeEnum } from '@fastgpt/global/core/dataset/constants';
import type { UseFormReturn } from 'react-hook-form';
import type { APIFileItem } from '@fastgpt/global/core/dataset/apiDataset';
import type { APIFileItem } from '@fastgpt/global/core/dataset/apiDataset/type';
export type ImportSourceItemType = {
id: string;