mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-21 11:43:56 +00:00

* feat: rewrite chat context (#3176) * feat: add app auto execute (#3115) * feat: add app auto execute * auto exec configtion * chatting animation * change icon * fix * fix * fix link * feat: add chat context to all chatbox * perf: loading ui --------- Co-authored-by: heheer <heheer@sealos.io> * app auto exec (#3179) * add chat records loaded state (#3184) * perf: chat store reset storage (#3186) * perf: chat store reset storage * perf: auto exec code * chore: workflow ui (#3175) * chore: workflow ui * fix * change icon color config * change popover to mymenu * 4.8.14 test (#3189) * update doc * fix: token check * perf: icon button * update doc * feat: share page support configuration Whether to allow the original view (#3194) * update doc * perf: fix index (#3206) * perf: i18n * perf: Add service entry (#3226) * 4.8.14 test (#3228) * fix: ai log * fix: text splitter * fix: reference unselect & user form description & simple to advance (#3229) * fix: reference unselect & user form description & simple to advance * change abort position * perf * perf: code (#3232) * perf: code * update doc * fix: create btn permission (#3233) * update doc * fix: refresh chatbox listener * perf: check invalid reference * perf: check invalid reference * update doc * fix: ui props --------- Co-authored-by: heheer <heheer@sealos.io>
172 lines
4.1 KiB
TypeScript
172 lines
4.1 KiB
TypeScript
import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constants';
|
|
import type { CreateDatasetCollectionParams } from '@fastgpt/global/core/dataset/api.d';
|
|
import { MongoDatasetCollection } from './schema';
|
|
import {
|
|
CollectionWithDatasetType,
|
|
DatasetCollectionSchemaType
|
|
} from '@fastgpt/global/core/dataset/type';
|
|
import { MongoDatasetTraining } from '../training/schema';
|
|
import { MongoDatasetData } from '../data/schema';
|
|
import { delImgByRelatedId } from '../../../common/file/image/controller';
|
|
import { deleteDatasetDataVector } from '../../../common/vectorStore/controller';
|
|
import { delFileByFileIdList } from '../../../common/file/gridfs/controller';
|
|
import { BucketNameEnum } from '@fastgpt/global/common/file/constants';
|
|
import { ClientSession } from '../../../common/mongo';
|
|
import { createOrGetCollectionTags } from './utils';
|
|
|
|
export async function createOneCollection({
|
|
teamId,
|
|
tmbId,
|
|
name,
|
|
parentId,
|
|
datasetId,
|
|
type,
|
|
|
|
trainingType = TrainingModeEnum.chunk,
|
|
chunkSize = 512,
|
|
chunkSplitter,
|
|
qaPrompt,
|
|
|
|
fileId,
|
|
rawLink,
|
|
|
|
externalFileId,
|
|
externalFileUrl,
|
|
|
|
hashRawText,
|
|
rawTextLength,
|
|
metadata = {},
|
|
session,
|
|
tags,
|
|
...props
|
|
}: CreateDatasetCollectionParams & {
|
|
teamId: string;
|
|
tmbId: string;
|
|
[key: string]: any;
|
|
session?: ClientSession;
|
|
}) {
|
|
// Create collection tags
|
|
const collectionTags = await createOrGetCollectionTags({ tags, teamId, datasetId, session });
|
|
|
|
// Create collection
|
|
const [collection] = await MongoDatasetCollection.create(
|
|
[
|
|
{
|
|
...props,
|
|
teamId,
|
|
tmbId,
|
|
parentId: parentId || null,
|
|
datasetId,
|
|
name,
|
|
type,
|
|
|
|
trainingType,
|
|
chunkSize,
|
|
chunkSplitter,
|
|
qaPrompt,
|
|
|
|
fileId,
|
|
rawLink,
|
|
...(externalFileId ? { externalFileId } : {}),
|
|
externalFileUrl,
|
|
|
|
rawTextLength,
|
|
hashRawText,
|
|
metadata,
|
|
tags: collectionTags
|
|
}
|
|
],
|
|
{ session }
|
|
);
|
|
|
|
return collection;
|
|
}
|
|
|
|
/* delete collection related images/files */
|
|
export const delCollectionRelatedSource = async ({
|
|
collections,
|
|
session
|
|
}: {
|
|
collections: (CollectionWithDatasetType | DatasetCollectionSchemaType)[];
|
|
session: ClientSession;
|
|
}) => {
|
|
if (collections.length === 0) return;
|
|
|
|
const teamId = collections[0].teamId;
|
|
|
|
if (!teamId) return Promise.reject('teamId is not exist');
|
|
|
|
const fileIdList = collections.map((item) => item?.fileId || '').filter(Boolean);
|
|
const relatedImageIds = collections
|
|
.map((item) => item?.metadata?.relatedImgId || '')
|
|
.filter(Boolean);
|
|
|
|
// delete files
|
|
await delFileByFileIdList({
|
|
bucketName: BucketNameEnum.dataset,
|
|
fileIdList
|
|
});
|
|
// delete images
|
|
await delImgByRelatedId({
|
|
teamId,
|
|
relateIds: relatedImageIds,
|
|
session
|
|
});
|
|
};
|
|
/**
|
|
* delete collection and it related data
|
|
*/
|
|
export async function delCollectionAndRelatedSources({
|
|
collections,
|
|
session
|
|
}: {
|
|
collections: (CollectionWithDatasetType | DatasetCollectionSchemaType)[];
|
|
session: ClientSession;
|
|
}) {
|
|
if (collections.length === 0) return;
|
|
|
|
const teamId = collections[0].teamId;
|
|
|
|
if (!teamId) return Promise.reject('teamId is not exist');
|
|
|
|
const datasetIds = Array.from(
|
|
new Set(
|
|
collections.map((item) => {
|
|
if (typeof item.datasetId === 'string') {
|
|
return String(item.datasetId);
|
|
}
|
|
return String(item.datasetId._id);
|
|
})
|
|
)
|
|
);
|
|
const collectionIds = collections.map((item) => String(item._id));
|
|
|
|
// delete training data
|
|
await MongoDatasetTraining.deleteMany({
|
|
teamId,
|
|
datasetIds: { $in: datasetIds },
|
|
collectionId: { $in: collectionIds }
|
|
});
|
|
|
|
/* file and imgs */
|
|
await delCollectionRelatedSource({ collections, session });
|
|
|
|
// delete dataset.datas
|
|
await MongoDatasetData.deleteMany(
|
|
{ teamId, datasetIds: { $in: datasetIds }, collectionId: { $in: collectionIds } },
|
|
{ session }
|
|
);
|
|
|
|
// delete collections
|
|
await MongoDatasetCollection.deleteMany(
|
|
{
|
|
teamId,
|
|
_id: { $in: collectionIds }
|
|
},
|
|
{ session }
|
|
);
|
|
|
|
// no session delete: delete files, vector data
|
|
await deleteDatasetDataVector({ teamId, datasetIds, collectionIds });
|
|
}
|