mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-09-25 16:16:01 +00:00

### What problem does this PR solve? Feat: Add TagTable #4367 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
341 lines
8.4 KiB
TypeScript
341 lines
8.4 KiB
TypeScript
import { ResponsePostType } from '@/interfaces/database/base';
|
|
import {
|
|
IKnowledge,
|
|
IRenameTag,
|
|
ITestingResult,
|
|
} from '@/interfaces/database/knowledge';
|
|
import i18n from '@/locales/config';
|
|
import kbService, {
|
|
listTag,
|
|
removeTag,
|
|
renameTag,
|
|
} from '@/services/knowledge-service';
|
|
import {
|
|
useInfiniteQuery,
|
|
useIsMutating,
|
|
useMutation,
|
|
useMutationState,
|
|
useQuery,
|
|
useQueryClient,
|
|
} from '@tanstack/react-query';
|
|
import { useDebounce } from 'ahooks';
|
|
import { message } from 'antd';
|
|
import { useSearchParams } from 'umi';
|
|
import { useHandleSearchChange } from './logic-hooks';
|
|
import { useSetPaginationParams } from './route-hook';
|
|
|
|
export const useKnowledgeBaseId = (): string => {
|
|
const [searchParams] = useSearchParams();
|
|
const knowledgeBaseId = searchParams.get('id');
|
|
|
|
return knowledgeBaseId || '';
|
|
};
|
|
|
|
export const useFetchKnowledgeBaseConfiguration = () => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
|
|
const { data, isFetching: loading } = useQuery({
|
|
queryKey: ['fetchKnowledgeDetail'],
|
|
initialData: {},
|
|
gcTime: 0,
|
|
queryFn: async () => {
|
|
const { data } = await kbService.get_kb_detail({
|
|
kb_id: knowledgeBaseId,
|
|
});
|
|
return data?.data ?? {};
|
|
},
|
|
});
|
|
|
|
return { data, loading };
|
|
};
|
|
|
|
export const useFetchKnowledgeList = (
|
|
shouldFilterListWithoutDocument: boolean = false,
|
|
): {
|
|
list: IKnowledge[];
|
|
loading: boolean;
|
|
} => {
|
|
const { data, isFetching: loading } = useQuery({
|
|
queryKey: ['fetchKnowledgeList'],
|
|
initialData: [],
|
|
gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
|
|
queryFn: async () => {
|
|
const { data } = await kbService.getList();
|
|
const list = data?.data?.kbs ?? [];
|
|
return shouldFilterListWithoutDocument
|
|
? list.filter((x: IKnowledge) => x.chunk_num > 0)
|
|
: list;
|
|
},
|
|
});
|
|
|
|
return { list: data, loading };
|
|
};
|
|
|
|
export const useInfiniteFetchKnowledgeList = () => {
|
|
const { searchString, handleInputChange } = useHandleSearchChange();
|
|
const debouncedSearchString = useDebounce(searchString, { wait: 500 });
|
|
|
|
const PageSize = 30;
|
|
const {
|
|
data,
|
|
error,
|
|
fetchNextPage,
|
|
hasNextPage,
|
|
isFetching,
|
|
isFetchingNextPage,
|
|
status,
|
|
} = useInfiniteQuery({
|
|
queryKey: ['infiniteFetchKnowledgeList', debouncedSearchString],
|
|
queryFn: async ({ pageParam }) => {
|
|
const { data } = await kbService.getList({
|
|
page: pageParam,
|
|
page_size: PageSize,
|
|
keywords: debouncedSearchString,
|
|
});
|
|
const list = data?.data ?? [];
|
|
return list;
|
|
},
|
|
initialPageParam: 1,
|
|
getNextPageParam: (lastPage, pages, lastPageParam) => {
|
|
if (lastPageParam * PageSize <= lastPage.total) {
|
|
return lastPageParam + 1;
|
|
}
|
|
return undefined;
|
|
},
|
|
});
|
|
return {
|
|
data,
|
|
loading: isFetching,
|
|
error,
|
|
fetchNextPage,
|
|
hasNextPage,
|
|
isFetching,
|
|
isFetchingNextPage,
|
|
status,
|
|
handleInputChange,
|
|
searchString,
|
|
};
|
|
};
|
|
|
|
export const useCreateKnowledge = () => {
|
|
const queryClient = useQueryClient();
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['createKnowledge'],
|
|
mutationFn: async (params: { id?: string; name: string }) => {
|
|
const { data = {} } = await kbService.createKb(params);
|
|
if (data.code === 0) {
|
|
message.success(
|
|
i18n.t(`message.${params?.id ? 'modified' : 'created'}`),
|
|
);
|
|
queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeList'] });
|
|
}
|
|
return data;
|
|
},
|
|
});
|
|
|
|
return { data, loading, createKnowledge: mutateAsync };
|
|
};
|
|
|
|
export const useDeleteKnowledge = () => {
|
|
const queryClient = useQueryClient();
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['deleteKnowledge'],
|
|
mutationFn: async (id: string) => {
|
|
const { data } = await kbService.rmKb({ kb_id: id });
|
|
if (data.code === 0) {
|
|
message.success(i18n.t(`message.deleted`));
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['infiniteFetchKnowledgeList'],
|
|
});
|
|
}
|
|
return data?.data ?? [];
|
|
},
|
|
});
|
|
|
|
return { data, loading, deleteKnowledge: mutateAsync };
|
|
};
|
|
|
|
//#region knowledge configuration
|
|
|
|
export const useUpdateKnowledge = () => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
const queryClient = useQueryClient();
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['saveKnowledge'],
|
|
mutationFn: async (params: Record<string, any>) => {
|
|
const { data = {} } = await kbService.updateKb({
|
|
kb_id: knowledgeBaseId,
|
|
...params,
|
|
});
|
|
if (data.code === 0) {
|
|
message.success(i18n.t(`message.updated`));
|
|
queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] });
|
|
}
|
|
return data;
|
|
},
|
|
});
|
|
|
|
return { data, loading, saveKnowledgeConfiguration: mutateAsync };
|
|
};
|
|
|
|
//#endregion
|
|
|
|
//#region Retrieval testing
|
|
|
|
export const useTestChunkRetrieval = (): ResponsePostType<ITestingResult> & {
|
|
testChunk: (...params: any[]) => void;
|
|
} => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
const { page, size: pageSize } = useSetPaginationParams();
|
|
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['testChunk'], // This method is invalid
|
|
gcTime: 0,
|
|
mutationFn: async (values: any) => {
|
|
const { data } = await kbService.retrieval_test({
|
|
...values,
|
|
kb_id: values.kb_id ?? knowledgeBaseId,
|
|
page,
|
|
size: pageSize,
|
|
});
|
|
if (data.code === 0) {
|
|
const res = data.data;
|
|
return {
|
|
chunks: res.chunks,
|
|
documents: res.doc_aggs,
|
|
total: res.total,
|
|
};
|
|
}
|
|
return (
|
|
data?.data ?? {
|
|
chunks: [],
|
|
documents: [],
|
|
total: 0,
|
|
}
|
|
);
|
|
},
|
|
});
|
|
|
|
return {
|
|
data: data ?? { chunks: [], documents: [], total: 0 },
|
|
loading,
|
|
testChunk: mutateAsync,
|
|
};
|
|
};
|
|
|
|
export const useChunkIsTesting = () => {
|
|
return useIsMutating({ mutationKey: ['testChunk'] }) > 0;
|
|
};
|
|
|
|
export const useSelectTestingResult = (): ITestingResult => {
|
|
const data = useMutationState({
|
|
filters: { mutationKey: ['testChunk'] },
|
|
select: (mutation) => {
|
|
return mutation.state.data;
|
|
},
|
|
});
|
|
return (data.at(-1) ?? {
|
|
chunks: [],
|
|
documents: [],
|
|
total: 0,
|
|
}) as ITestingResult;
|
|
};
|
|
|
|
export const useSelectIsTestingSuccess = () => {
|
|
const status = useMutationState({
|
|
filters: { mutationKey: ['testChunk'] },
|
|
select: (mutation) => {
|
|
return mutation.state.status;
|
|
},
|
|
});
|
|
return status.at(-1) === 'success';
|
|
};
|
|
//#endregion
|
|
|
|
//#region tags
|
|
|
|
export const useFetchTagList = () => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
|
|
const { data, isFetching: loading } = useQuery<Array<[string, number]>>({
|
|
queryKey: ['fetchTagList'],
|
|
initialData: [],
|
|
gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
|
|
queryFn: async () => {
|
|
const { data } = await listTag(knowledgeBaseId);
|
|
const list = data?.data || [];
|
|
return list;
|
|
},
|
|
});
|
|
|
|
return { list: data, loading };
|
|
};
|
|
|
|
export const useDeleteTag = () => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
|
|
const queryClient = useQueryClient();
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['deleteTag'],
|
|
mutationFn: async (tags: string[]) => {
|
|
const { data } = await removeTag(knowledgeBaseId, tags);
|
|
if (data.code === 0) {
|
|
message.success(i18n.t(`message.deleted`));
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['fetchTagList'],
|
|
});
|
|
}
|
|
return data?.data ?? [];
|
|
},
|
|
});
|
|
|
|
return { data, loading, deleteTag: mutateAsync };
|
|
};
|
|
|
|
export const useRenameTag = () => {
|
|
const knowledgeBaseId = useKnowledgeBaseId();
|
|
|
|
const queryClient = useQueryClient();
|
|
const {
|
|
data,
|
|
isPending: loading,
|
|
mutateAsync,
|
|
} = useMutation({
|
|
mutationKey: ['deleteTag'],
|
|
mutationFn: async (params: IRenameTag) => {
|
|
const { data } = await renameTag(knowledgeBaseId, params);
|
|
if (data.code === 0) {
|
|
message.success(i18n.t(`message.modified`));
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['fetchTagList'],
|
|
});
|
|
}
|
|
return data?.data ?? [];
|
|
},
|
|
});
|
|
|
|
return { data, loading, renameTag: mutateAsync };
|
|
};
|
|
|
|
//#endregion
|