Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import {
  2. IKnowledge,
  3. IKnowledgeResult,
  4. INextTestingResult,
  5. } from '@/interfaces/database/knowledge';
  6. import { ITestRetrievalRequestBody } from '@/interfaces/request/knowledge';
  7. import i18n from '@/locales/config';
  8. import kbService, { listDataset } from '@/services/knowledge-service';
  9. import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
  10. import { useDebounce } from 'ahooks';
  11. import { message } from 'antd';
  12. import { useCallback, useMemo, useState } from 'react';
  13. import { useParams } from 'umi';
  14. import {
  15. useGetPaginationWithRouter,
  16. useHandleSearchChange,
  17. } from './logic-hooks';
  18. import { useSetPaginationParams } from './route-hook';
  19. export const enum KnowledgeApiAction {
  20. TestRetrieval = 'testRetrieval',
  21. FetchKnowledgeListByPage = 'fetchKnowledgeListByPage',
  22. CreateKnowledge = 'createKnowledge',
  23. DeleteKnowledge = 'deleteKnowledge',
  24. SaveKnowledge = 'saveKnowledge',
  25. FetchKnowledgeDetail = 'fetchKnowledgeDetail',
  26. }
  27. export const useKnowledgeBaseId = () => {
  28. const { id } = useParams();
  29. return id;
  30. };
  31. export const useTestRetrieval = () => {
  32. const knowledgeBaseId = useKnowledgeBaseId();
  33. const { page, size: pageSize } = useSetPaginationParams();
  34. const [values, setValues] = useState<ITestRetrievalRequestBody>();
  35. const queryParams = useMemo(() => {
  36. return {
  37. ...values,
  38. kb_id: values?.kb_id || knowledgeBaseId,
  39. page,
  40. size: pageSize,
  41. };
  42. }, [knowledgeBaseId, page, pageSize, values]);
  43. const {
  44. data,
  45. isFetching: loading,
  46. refetch,
  47. } = useQuery<INextTestingResult>({
  48. queryKey: [KnowledgeApiAction.TestRetrieval, queryParams],
  49. initialData: {
  50. chunks: [],
  51. doc_aggs: [],
  52. total: 0,
  53. },
  54. enabled: false,
  55. gcTime: 0,
  56. queryFn: async () => {
  57. const { data } = await kbService.retrieval_test(queryParams);
  58. console.log('🚀 ~ queryFn: ~ data:', data);
  59. return data?.data ?? {};
  60. },
  61. });
  62. return { data, loading, setValues, refetch };
  63. };
  64. export const useFetchNextKnowledgeListByPage = () => {
  65. const { searchString, handleInputChange } = useHandleSearchChange();
  66. const { pagination, setPagination } = useGetPaginationWithRouter();
  67. const [ownerIds, setOwnerIds] = useState<string[]>([]);
  68. const debouncedSearchString = useDebounce(searchString, { wait: 500 });
  69. const { data, isFetching: loading } = useQuery<IKnowledgeResult>({
  70. queryKey: [
  71. KnowledgeApiAction.FetchKnowledgeListByPage,
  72. {
  73. debouncedSearchString,
  74. ...pagination,
  75. ownerIds,
  76. },
  77. ],
  78. initialData: {
  79. kbs: [],
  80. total: 0,
  81. },
  82. gcTime: 0,
  83. queryFn: async () => {
  84. const { data } = await listDataset(
  85. {
  86. keywords: debouncedSearchString,
  87. page_size: pagination.pageSize,
  88. page: pagination.current,
  89. },
  90. {
  91. owner_ids: ownerIds,
  92. },
  93. );
  94. return data?.data;
  95. },
  96. });
  97. const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(
  98. (e) => {
  99. // setPagination({ page: 1 }); // TODO: 这里导致重复请求
  100. handleInputChange(e);
  101. },
  102. [handleInputChange],
  103. );
  104. const handleOwnerIdsChange = useCallback((ids: string[]) => {
  105. // setPagination({ page: 1 }); // TODO: 这里导致重复请求
  106. setOwnerIds(ids);
  107. }, []);
  108. return {
  109. ...data,
  110. searchString,
  111. handleInputChange: onInputChange,
  112. pagination: { ...pagination, total: data?.total },
  113. setPagination,
  114. loading,
  115. setOwnerIds: handleOwnerIdsChange,
  116. ownerIds,
  117. };
  118. };
  119. export const useCreateKnowledge = () => {
  120. const queryClient = useQueryClient();
  121. const {
  122. data,
  123. isPending: loading,
  124. mutateAsync,
  125. } = useMutation({
  126. mutationKey: [KnowledgeApiAction.CreateKnowledge],
  127. mutationFn: async (params: { id?: string; name: string }) => {
  128. const { data = {} } = await kbService.createKb(params);
  129. if (data.code === 0) {
  130. message.success(
  131. i18n.t(`message.${params?.id ? 'modified' : 'created'}`),
  132. );
  133. queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeList'] });
  134. }
  135. return data;
  136. },
  137. });
  138. return { data, loading, createKnowledge: mutateAsync };
  139. };
  140. export const useDeleteKnowledge = () => {
  141. const queryClient = useQueryClient();
  142. const {
  143. data,
  144. isPending: loading,
  145. mutateAsync,
  146. } = useMutation({
  147. mutationKey: [KnowledgeApiAction.DeleteKnowledge],
  148. mutationFn: async (id: string) => {
  149. const { data } = await kbService.rmKb({ kb_id: id });
  150. if (data.code === 0) {
  151. message.success(i18n.t(`message.deleted`));
  152. queryClient.invalidateQueries({
  153. queryKey: [KnowledgeApiAction.FetchKnowledgeListByPage],
  154. });
  155. }
  156. return data?.data ?? [];
  157. },
  158. });
  159. return { data, loading, deleteKnowledge: mutateAsync };
  160. };
  161. export const useUpdateKnowledge = (shouldFetchList = false) => {
  162. const knowledgeBaseId = useKnowledgeBaseId();
  163. const queryClient = useQueryClient();
  164. const {
  165. data,
  166. isPending: loading,
  167. mutateAsync,
  168. } = useMutation({
  169. mutationKey: [KnowledgeApiAction.SaveKnowledge],
  170. mutationFn: async (params: Record<string, any>) => {
  171. const { data = {} } = await kbService.updateKb({
  172. kb_id: params?.kb_id ? params?.kb_id : knowledgeBaseId,
  173. ...params,
  174. });
  175. if (data.code === 0) {
  176. message.success(i18n.t(`message.updated`));
  177. if (shouldFetchList) {
  178. queryClient.invalidateQueries({
  179. queryKey: [KnowledgeApiAction.FetchKnowledgeListByPage],
  180. });
  181. } else {
  182. queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] });
  183. }
  184. }
  185. return data;
  186. },
  187. });
  188. return { data, loading, saveKnowledgeConfiguration: mutateAsync };
  189. };
  190. export const useFetchKnowledgeBaseConfiguration = () => {
  191. const { id } = useParams();
  192. const { data, isFetching: loading } = useQuery<IKnowledge>({
  193. queryKey: [KnowledgeApiAction.FetchKnowledgeDetail],
  194. initialData: {} as IKnowledge,
  195. gcTime: 0,
  196. queryFn: async () => {
  197. const { data } = await kbService.get_kb_detail({
  198. kb_id: id,
  199. });
  200. return data?.data ?? {};
  201. },
  202. });
  203. return { data, loading };
  204. };