Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

knowledge-hooks.ts 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. import { ResponsePostType } from '@/interfaces/database/base';
  2. import {
  3. IKnowledge,
  4. IRenameTag,
  5. ITestingResult,
  6. } from '@/interfaces/database/knowledge';
  7. import i18n from '@/locales/config';
  8. import kbService, {
  9. listTag,
  10. removeTag,
  11. renameTag,
  12. } from '@/services/knowledge-service';
  13. import {
  14. useInfiniteQuery,
  15. useIsMutating,
  16. useMutation,
  17. useMutationState,
  18. useQuery,
  19. useQueryClient,
  20. } from '@tanstack/react-query';
  21. import { useDebounce } from 'ahooks';
  22. import { message } from 'antd';
  23. import { useSearchParams } from 'umi';
  24. import { useHandleSearchChange } from './logic-hooks';
  25. import { useSetPaginationParams } from './route-hook';
  26. export const useKnowledgeBaseId = (): string => {
  27. const [searchParams] = useSearchParams();
  28. const knowledgeBaseId = searchParams.get('id');
  29. return knowledgeBaseId || '';
  30. };
  31. export const useFetchKnowledgeBaseConfiguration = () => {
  32. const knowledgeBaseId = useKnowledgeBaseId();
  33. const { data, isFetching: loading } = useQuery({
  34. queryKey: ['fetchKnowledgeDetail'],
  35. initialData: {},
  36. gcTime: 0,
  37. queryFn: async () => {
  38. const { data } = await kbService.get_kb_detail({
  39. kb_id: knowledgeBaseId,
  40. });
  41. return data?.data ?? {};
  42. },
  43. });
  44. return { data, loading };
  45. };
  46. export const useFetchKnowledgeList = (
  47. shouldFilterListWithoutDocument: boolean = false,
  48. ): {
  49. list: IKnowledge[];
  50. loading: boolean;
  51. } => {
  52. const { data, isFetching: loading } = useQuery({
  53. queryKey: ['fetchKnowledgeList'],
  54. initialData: [],
  55. gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
  56. queryFn: async () => {
  57. const { data } = await kbService.getList();
  58. const list = data?.data?.kbs ?? [];
  59. return shouldFilterListWithoutDocument
  60. ? list.filter((x: IKnowledge) => x.chunk_num > 0)
  61. : list;
  62. },
  63. });
  64. return { list: data, loading };
  65. };
  66. export const useInfiniteFetchKnowledgeList = () => {
  67. const { searchString, handleInputChange } = useHandleSearchChange();
  68. const debouncedSearchString = useDebounce(searchString, { wait: 500 });
  69. const PageSize = 30;
  70. const {
  71. data,
  72. error,
  73. fetchNextPage,
  74. hasNextPage,
  75. isFetching,
  76. isFetchingNextPage,
  77. status,
  78. } = useInfiniteQuery({
  79. queryKey: ['infiniteFetchKnowledgeList', debouncedSearchString],
  80. queryFn: async ({ pageParam }) => {
  81. const { data } = await kbService.getList({
  82. page: pageParam,
  83. page_size: PageSize,
  84. keywords: debouncedSearchString,
  85. });
  86. const list = data?.data ?? [];
  87. return list;
  88. },
  89. initialPageParam: 1,
  90. getNextPageParam: (lastPage, pages, lastPageParam) => {
  91. if (lastPageParam * PageSize <= lastPage.total) {
  92. return lastPageParam + 1;
  93. }
  94. return undefined;
  95. },
  96. });
  97. return {
  98. data,
  99. loading: isFetching,
  100. error,
  101. fetchNextPage,
  102. hasNextPage,
  103. isFetching,
  104. isFetchingNextPage,
  105. status,
  106. handleInputChange,
  107. searchString,
  108. };
  109. };
  110. export const useCreateKnowledge = () => {
  111. const queryClient = useQueryClient();
  112. const {
  113. data,
  114. isPending: loading,
  115. mutateAsync,
  116. } = useMutation({
  117. mutationKey: ['createKnowledge'],
  118. mutationFn: async (params: { id?: string; name: string }) => {
  119. const { data = {} } = await kbService.createKb(params);
  120. if (data.code === 0) {
  121. message.success(
  122. i18n.t(`message.${params?.id ? 'modified' : 'created'}`),
  123. );
  124. queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeList'] });
  125. }
  126. return data;
  127. },
  128. });
  129. return { data, loading, createKnowledge: mutateAsync };
  130. };
  131. export const useDeleteKnowledge = () => {
  132. const queryClient = useQueryClient();
  133. const {
  134. data,
  135. isPending: loading,
  136. mutateAsync,
  137. } = useMutation({
  138. mutationKey: ['deleteKnowledge'],
  139. mutationFn: async (id: string) => {
  140. const { data } = await kbService.rmKb({ kb_id: id });
  141. if (data.code === 0) {
  142. message.success(i18n.t(`message.deleted`));
  143. queryClient.invalidateQueries({
  144. queryKey: ['infiniteFetchKnowledgeList'],
  145. });
  146. }
  147. return data?.data ?? [];
  148. },
  149. });
  150. return { data, loading, deleteKnowledge: mutateAsync };
  151. };
  152. //#region knowledge configuration
  153. export const useUpdateKnowledge = () => {
  154. const knowledgeBaseId = useKnowledgeBaseId();
  155. const queryClient = useQueryClient();
  156. const {
  157. data,
  158. isPending: loading,
  159. mutateAsync,
  160. } = useMutation({
  161. mutationKey: ['saveKnowledge'],
  162. mutationFn: async (params: Record<string, any>) => {
  163. const { data = {} } = await kbService.updateKb({
  164. kb_id: knowledgeBaseId,
  165. ...params,
  166. });
  167. if (data.code === 0) {
  168. message.success(i18n.t(`message.updated`));
  169. queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] });
  170. }
  171. return data;
  172. },
  173. });
  174. return { data, loading, saveKnowledgeConfiguration: mutateAsync };
  175. };
  176. //#endregion
  177. //#region Retrieval testing
  178. export const useTestChunkRetrieval = (): ResponsePostType<ITestingResult> & {
  179. testChunk: (...params: any[]) => void;
  180. } => {
  181. const knowledgeBaseId = useKnowledgeBaseId();
  182. const { page, size: pageSize } = useSetPaginationParams();
  183. const {
  184. data,
  185. isPending: loading,
  186. mutateAsync,
  187. } = useMutation({
  188. mutationKey: ['testChunk'], // This method is invalid
  189. gcTime: 0,
  190. mutationFn: async (values: any) => {
  191. const { data } = await kbService.retrieval_test({
  192. ...values,
  193. kb_id: values.kb_id ?? knowledgeBaseId,
  194. page,
  195. size: pageSize,
  196. });
  197. if (data.code === 0) {
  198. const res = data.data;
  199. return {
  200. chunks: res.chunks,
  201. documents: res.doc_aggs,
  202. total: res.total,
  203. };
  204. }
  205. return (
  206. data?.data ?? {
  207. chunks: [],
  208. documents: [],
  209. total: 0,
  210. }
  211. );
  212. },
  213. });
  214. return {
  215. data: data ?? { chunks: [], documents: [], total: 0 },
  216. loading,
  217. testChunk: mutateAsync,
  218. };
  219. };
  220. export const useChunkIsTesting = () => {
  221. return useIsMutating({ mutationKey: ['testChunk'] }) > 0;
  222. };
  223. export const useSelectTestingResult = (): ITestingResult => {
  224. const data = useMutationState({
  225. filters: { mutationKey: ['testChunk'] },
  226. select: (mutation) => {
  227. return mutation.state.data;
  228. },
  229. });
  230. return (data.at(-1) ?? {
  231. chunks: [],
  232. documents: [],
  233. total: 0,
  234. }) as ITestingResult;
  235. };
  236. export const useSelectIsTestingSuccess = () => {
  237. const status = useMutationState({
  238. filters: { mutationKey: ['testChunk'] },
  239. select: (mutation) => {
  240. return mutation.state.status;
  241. },
  242. });
  243. return status.at(-1) === 'success';
  244. };
  245. //#endregion
  246. //#region tags
  247. export const useFetchTagList = () => {
  248. const knowledgeBaseId = useKnowledgeBaseId();
  249. const { data, isFetching: loading } = useQuery<Array<[string, number]>>({
  250. queryKey: ['fetchTagList'],
  251. initialData: [],
  252. gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
  253. queryFn: async () => {
  254. const { data } = await listTag(knowledgeBaseId);
  255. const list = data?.data || [];
  256. return list;
  257. },
  258. });
  259. return { list: data, loading };
  260. };
  261. export const useDeleteTag = () => {
  262. const knowledgeBaseId = useKnowledgeBaseId();
  263. const queryClient = useQueryClient();
  264. const {
  265. data,
  266. isPending: loading,
  267. mutateAsync,
  268. } = useMutation({
  269. mutationKey: ['deleteTag'],
  270. mutationFn: async (tags: string[]) => {
  271. const { data } = await removeTag(knowledgeBaseId, tags);
  272. if (data.code === 0) {
  273. message.success(i18n.t(`message.deleted`));
  274. queryClient.invalidateQueries({
  275. queryKey: ['fetchTagList'],
  276. });
  277. }
  278. return data?.data ?? [];
  279. },
  280. });
  281. return { data, loading, deleteTag: mutateAsync };
  282. };
  283. export const useRenameTag = () => {
  284. const knowledgeBaseId = useKnowledgeBaseId();
  285. const queryClient = useQueryClient();
  286. const {
  287. data,
  288. isPending: loading,
  289. mutateAsync,
  290. } = useMutation({
  291. mutationKey: ['renameTag'],
  292. mutationFn: async (params: IRenameTag) => {
  293. const { data } = await renameTag(knowledgeBaseId, params);
  294. if (data.code === 0) {
  295. message.success(i18n.t(`message.modified`));
  296. queryClient.invalidateQueries({
  297. queryKey: ['fetchTagList'],
  298. });
  299. }
  300. return data?.data ?? [];
  301. },
  302. });
  303. return { data, loading, renameTag: mutateAsync };
  304. };
  305. export const useTagIsRenaming = () => {
  306. return useIsMutating({ mutationKey: ['renameTag'] }) > 0;
  307. };
  308. //#endregion