balibabu
Feat: If there is no result in the recall test, an empty data image will be displayed. #4182 (#4183)
c34c86c
| import { ResponsePostType } from '@/interfaces/database/base'; | |
| import { IKnowledge, ITestingResult } from '@/interfaces/database/knowledge'; | |
| import i18n from '@/locales/config'; | |
| import kbService 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 | |