| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- 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: ['renameTag'],
- 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 };
- };
-
- export const useTagIsRenaming = () => {
- return useIsMutating({ mutationKey: ['renameTag'] }) > 0;
- };
-
- //#endregion
|