mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? Feat: Delete useless request hooks. #10427 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@ -9,7 +9,7 @@ import {
|
|||||||
useFetchManualSystemTokenList,
|
useFetchManualSystemTokenList,
|
||||||
useFetchSystemTokenList,
|
useFetchSystemTokenList,
|
||||||
useRemoveSystemToken,
|
useRemoveSystemToken,
|
||||||
} from '@/hooks/user-setting-hooks';
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { IStats } from '@/interfaces/database/chat';
|
import { IStats } from '@/interfaces/database/chat';
|
||||||
import { useQueryClient } from '@tanstack/react-query';
|
import { useQueryClient } from '@tanstack/react-query';
|
||||||
import { message } from 'antd';
|
import { message } from 'antd';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useSelectParserList } from '@/hooks/user-setting-hooks';
|
import { useSelectParserList } from '@/hooks/use-user-setting-request';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
const ParserListMap = new Map([
|
const ParserListMap = new Map([
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { DocumentParserType } from '@/constants/knowledge';
|
import { DocumentParserType } from '@/constants/knowledge';
|
||||||
import { useHandleChunkMethodSelectChange } from '@/hooks/logic-hooks';
|
import { useHandleChunkMethodSelectChange } from '@/hooks/logic-hooks';
|
||||||
import { useSelectParserList } from '@/hooks/user-setting-hooks';
|
import { useSelectParserList } from '@/hooks/use-user-setting-request';
|
||||||
import { FormInstance } from 'antd';
|
import { FormInstance } from 'antd';
|
||||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import { useFetchParserListOnMount, useShowAutoKeywords } from './hooks';
|
|||||||
|
|
||||||
import { DocumentParserType } from '@/constants/knowledge';
|
import { DocumentParserType } from '@/constants/knowledge';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
|
||||||
import { IParserConfig } from '@/interfaces/database/document';
|
import { IParserConfig } from '@/interfaces/database/document';
|
||||||
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
||||||
import { get } from 'lodash';
|
import { get } from 'lodash';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
|
import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useFetchManualSystemTokenList } from '@/hooks/user-setting-hooks';
|
import { useFetchManualSystemTokenList } from '@/hooks/use-user-setting-request';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import message from '../ui/message';
|
import message from '../ui/message';
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { getExtension } from '@/utils/document-util';
|
import { getExtension } from '@/utils/document-util';
|
||||||
import SvgIcon from '../svg-icon';
|
import SvgIcon from '../svg-icon';
|
||||||
|
|
||||||
import { useFetchDocumentThumbnailsByIds } from '@/hooks/document-hooks';
|
import { useFetchDocumentThumbnailsByIds } from '@/hooks/use-document-request';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import styles from './index.less';
|
import styles from './index.less';
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
import Image from '@/components/image';
|
import Image from '@/components/image';
|
||||||
import SvgIcon from '@/components/svg-icon';
|
import SvgIcon from '@/components/svg-icon';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
useFetchDocumentThumbnailsByIds,
|
useFetchDocumentThumbnailsByIds,
|
||||||
useGetDocumentUrl,
|
useGetDocumentUrl,
|
||||||
} from '@/hooks/document-hooks';
|
} from '@/hooks/use-document-request';
|
||||||
import { IReference, IReferenceChunk } from '@/interfaces/database/chat';
|
import { IReference, IReferenceChunk } from '@/interfaces/database/chat';
|
||||||
import {
|
import {
|
||||||
currentReg,
|
currentReg,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import IndentedTree from './indented-tree';
|
import IndentedTree from './indented-tree';
|
||||||
|
|
||||||
import { useFetchKnowledgeGraph } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeGraph } from '@/hooks/use-knowledge-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { Modal } from 'antd';
|
import { Modal } from 'antd';
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { DocumentParserType } from '@/constants/knowledge';
|
import { DocumentParserType } from '@/constants/knowledge';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeList } from '@/hooks/use-knowledge-request';
|
||||||
import { useBuildQueryVariableOptions } from '@/pages/agent/hooks/use-get-begin-query';
|
import { useBuildQueryVariableOptions } from '@/pages/agent/hooks/use-get-begin-query';
|
||||||
import { UserOutlined } from '@ant-design/icons';
|
import { UserOutlined } from '@ant-design/icons';
|
||||||
import { Avatar as AntAvatar, Form, Select, Space } from 'antd';
|
import { Avatar as AntAvatar, Form, Select, Space } from 'antd';
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks';
|
import { useSelectLlmOptionsByModelType } from '@/hooks/use-llm-request';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { camelCase } from 'lodash';
|
import { camelCase } from 'lodash';
|
||||||
import { ReactNode, useMemo } from 'react';
|
import { ReactNode, useMemo } from 'react';
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks';
|
import { useSelectLlmOptionsByModelType } from '@/hooks/use-llm-request';
|
||||||
import { Form, Select } from 'antd';
|
import { Form, Select } from 'antd';
|
||||||
import { camelCase } from 'lodash';
|
import { camelCase } from 'lodash';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
|
import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request';
|
||||||
import { Popover as AntPopover, Select as AntSelect } from 'antd';
|
import { Popover as AntPopover, Select as AntSelect } from 'antd';
|
||||||
import LlmSettingItems from '../llm-setting-items';
|
import LlmSettingItems from '../llm-setting-items';
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
|
import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request';
|
||||||
import * as SelectPrimitive from '@radix-ui/react-select';
|
import * as SelectPrimitive from '@radix-ui/react-select';
|
||||||
import { forwardRef, memo, useMemo, useState } from 'react';
|
import { forwardRef, memo, useMemo, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import { Flex, Form, InputNumber, Select, Slider, Switch, Tooltip } from 'antd';
|
|||||||
import camelCase from 'lodash/camelCase';
|
import camelCase from 'lodash/camelCase';
|
||||||
|
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
|
import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request';
|
||||||
import { setChatVariableEnabledFieldValuePage } from '@/utils/chat';
|
import { setChatVariableEnabledFieldValuePage } from '@/utils/chat';
|
||||||
import { QuestionCircleOutlined } from '@ant-design/icons';
|
import { QuestionCircleOutlined } from '@ant-design/icons';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
|
import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { SelectWithSearch } from '../originui/select-with-search';
|
import { SelectWithSearch } from '../originui/select-with-search';
|
||||||
import { RAGFlowFormItem } from '../ragflow-form';
|
import { RAGFlowFormItem } from '../ragflow-form';
|
||||||
|
|||||||
@ -13,11 +13,11 @@ import remarkGfm from 'remark-gfm';
|
|||||||
import remarkMath from 'remark-math';
|
import remarkMath from 'remark-math';
|
||||||
import { visitParents } from 'unist-util-visit-parents';
|
import { visitParents } from 'unist-util-visit-parents';
|
||||||
|
|
||||||
import { useFetchDocumentThumbnailsByIds } from '@/hooks/document-hooks';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
||||||
|
|
||||||
|
import { useFetchDocumentThumbnailsByIds } from '@/hooks/use-document-request';
|
||||||
import {
|
import {
|
||||||
currentReg,
|
currentReg,
|
||||||
preprocessLaTeX,
|
preprocessLaTeX,
|
||||||
|
|||||||
@ -13,7 +13,6 @@ import remarkGfm from 'remark-gfm';
|
|||||||
import remarkMath from 'remark-math';
|
import remarkMath from 'remark-math';
|
||||||
import { visitParents } from 'unist-util-visit-parents';
|
import { visitParents } from 'unist-util-visit-parents';
|
||||||
|
|
||||||
import { useFetchDocumentThumbnailsByIds } from '@/hooks/document-hooks';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
||||||
@ -26,6 +25,7 @@ import {
|
|||||||
showImage,
|
showImage,
|
||||||
} from '@/utils/chat';
|
} from '@/utils/chat';
|
||||||
|
|
||||||
|
import { useFetchDocumentThumbnailsByIds } from '@/hooks/use-document-request';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { omit } from 'lodash';
|
import { omit } from 'lodash';
|
||||||
|
|||||||
@ -1,7 +1,3 @@
|
|||||||
import {
|
|
||||||
useGetChunkHighlights,
|
|
||||||
useGetDocumentUrl,
|
|
||||||
} from '@/hooks/document-hooks';
|
|
||||||
import { IReferenceChunk } from '@/interfaces/database/chat';
|
import { IReferenceChunk } from '@/interfaces/database/chat';
|
||||||
import { IChunk } from '@/interfaces/database/knowledge';
|
import { IChunk } from '@/interfaces/database/knowledge';
|
||||||
import FileError from '@/pages/document-viewer/file-error';
|
import FileError from '@/pages/document-viewer/file-error';
|
||||||
@ -17,6 +13,10 @@ import {
|
|||||||
} from 'react-pdf-highlighter';
|
} from 'react-pdf-highlighter';
|
||||||
import { useCatchDocumentError } from './hooks';
|
import { useCatchDocumentError } from './hooks';
|
||||||
|
|
||||||
|
import {
|
||||||
|
useGetChunkHighlights,
|
||||||
|
useGetDocumentUrl,
|
||||||
|
} from '@/hooks/use-document-request';
|
||||||
import styles from './index.less';
|
import styles from './index.less';
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks';
|
import { useSelectLlmOptionsByModelType } from '@/hooks/use-llm-request';
|
||||||
import { Select as AntSelect, Form, message, Slider } from 'antd';
|
import { Select as AntSelect, Form, message, Slider } from 'antd';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useFormContext } from 'react-hook-form';
|
import { useFormContext } from 'react-hook-form';
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import SelectFiles from './select-files';
|
|||||||
import {
|
import {
|
||||||
useAllTestingResult,
|
useAllTestingResult,
|
||||||
useSelectTestingResult,
|
useSelectTestingResult,
|
||||||
} from '@/hooks/knowledge-hooks';
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import styles from './index.less';
|
import styles from './index.less';
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { useTranslate } from '@/hooks/common-hooks';
|
|||||||
import {
|
import {
|
||||||
useAllTestingResult,
|
useAllTestingResult,
|
||||||
useSelectTestingResult,
|
useSelectTestingResult,
|
||||||
} from '@/hooks/knowledge-hooks';
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { ITestingDocument } from '@/interfaces/database/knowledge';
|
import { ITestingDocument } from '@/interfaces/database/knowledge';
|
||||||
import { EyeOutlined } from '@ant-design/icons';
|
import { EyeOutlined } from '@ant-design/icons';
|
||||||
import { Button, Table, TableProps, Tooltip } from 'antd';
|
import { Button, Table, TableProps, Tooltip } from 'antd';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { PropsWithChildren } from 'react';
|
import { PropsWithChildren } from 'react';
|
||||||
|
|
||||||
export function SharedBadge({ children }: PropsWithChildren) {
|
export function SharedBadge({ children }: PropsWithChildren) {
|
||||||
|
|||||||
@ -1,210 +0,0 @@
|
|||||||
import { ResponseGetType, ResponseType } from '@/interfaces/database/base';
|
|
||||||
import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge';
|
|
||||||
import kbService from '@/services/knowledge-service';
|
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
||||||
import { useDebounce } from 'ahooks';
|
|
||||||
import { PaginationProps, message } from 'antd';
|
|
||||||
import { useCallback, useState } from 'react';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import {
|
|
||||||
useGetPaginationWithRouter,
|
|
||||||
useHandleSearchChange,
|
|
||||||
} from './logic-hooks';
|
|
||||||
import {
|
|
||||||
useGetKnowledgeSearchParams,
|
|
||||||
useSetPaginationParams,
|
|
||||||
} from './route-hook';
|
|
||||||
|
|
||||||
export interface IChunkListResult {
|
|
||||||
searchString?: string;
|
|
||||||
handleInputChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
||||||
pagination: PaginationProps;
|
|
||||||
setPagination?: (pagination: { page: number; pageSize: number }) => void;
|
|
||||||
available: number | undefined;
|
|
||||||
handleSetAvailable: (available: number | undefined) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useFetchNextChunkList = (): ResponseGetType<{
|
|
||||||
data: IChunk[];
|
|
||||||
total: number;
|
|
||||||
documentInfo: IKnowledgeFile;
|
|
||||||
}> &
|
|
||||||
IChunkListResult => {
|
|
||||||
const { pagination, setPagination } = useGetPaginationWithRouter();
|
|
||||||
const { documentId } = useGetKnowledgeSearchParams();
|
|
||||||
const { searchString, handleInputChange } = useHandleSearchChange();
|
|
||||||
const [available, setAvailable] = useState<number | undefined>();
|
|
||||||
const debouncedSearchString = useDebounce(searchString, { wait: 500 });
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: [
|
|
||||||
'fetchChunkList',
|
|
||||||
documentId,
|
|
||||||
pagination.current,
|
|
||||||
pagination.pageSize,
|
|
||||||
debouncedSearchString,
|
|
||||||
available,
|
|
||||||
],
|
|
||||||
placeholderData: (previousData) =>
|
|
||||||
previousData ?? { data: [], total: 0, documentInfo: {} }, // https://github.com/TanStack/query/issues/8183
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await kbService.chunk_list({
|
|
||||||
doc_id: documentId,
|
|
||||||
page: pagination.current,
|
|
||||||
size: pagination.pageSize,
|
|
||||||
available_int: available,
|
|
||||||
keywords: searchString,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
const res = data.data;
|
|
||||||
return {
|
|
||||||
data: res.chunks,
|
|
||||||
total: res.total,
|
|
||||||
documentInfo: res.doc,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
data?.data ?? {
|
|
||||||
data: [],
|
|
||||||
total: 0,
|
|
||||||
documentInfo: {},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(
|
|
||||||
(e) => {
|
|
||||||
setPagination({ page: 1 });
|
|
||||||
handleInputChange(e);
|
|
||||||
},
|
|
||||||
[handleInputChange, setPagination],
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleSetAvailable = useCallback(
|
|
||||||
(a: number | undefined) => {
|
|
||||||
setPagination({ page: 1 });
|
|
||||||
setAvailable(a);
|
|
||||||
},
|
|
||||||
[setAvailable, setPagination],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
data,
|
|
||||||
loading,
|
|
||||||
pagination,
|
|
||||||
setPagination,
|
|
||||||
searchString,
|
|
||||||
handleInputChange: onInputChange,
|
|
||||||
available,
|
|
||||||
handleSetAvailable,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSelectChunkList = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const data = queryClient.getQueriesData<{
|
|
||||||
data: IChunk[];
|
|
||||||
total: number;
|
|
||||||
documentInfo: IKnowledgeFile;
|
|
||||||
}>({ queryKey: ['fetchChunkList'] });
|
|
||||||
|
|
||||||
return data?.at(-1)?.[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteChunk = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { setPaginationParams } = useSetPaginationParams();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteChunk'],
|
|
||||||
mutationFn: async (params: { chunkIds: string[]; doc_id: string }) => {
|
|
||||||
const { data } = await kbService.rm_chunk(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
setPaginationParams(1);
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] });
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteChunk: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSwitchChunk = () => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['switchChunk'],
|
|
||||||
mutationFn: async (params: {
|
|
||||||
chunk_ids?: string[];
|
|
||||||
available_int?: number;
|
|
||||||
doc_id: string;
|
|
||||||
}) => {
|
|
||||||
const { data } = await kbService.switch_chunk(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.modified'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] });
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, switchChunk: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useCreateChunk = () => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['createChunk'],
|
|
||||||
mutationFn: async (payload: any) => {
|
|
||||||
let service = kbService.create_chunk;
|
|
||||||
if (payload.chunk_id) {
|
|
||||||
service = kbService.set_chunk;
|
|
||||||
}
|
|
||||||
const { data } = await service(payload);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.created'));
|
|
||||||
setTimeout(() => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] });
|
|
||||||
}, 1000); // Delay to ensure the list is updated
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, createChunk: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchChunk = (chunkId?: string): ResponseType<any> => {
|
|
||||||
const { data } = useQuery({
|
|
||||||
queryKey: ['fetchChunk'],
|
|
||||||
enabled: !!chunkId,
|
|
||||||
initialData: {},
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const data = await kbService.get_chunk({
|
|
||||||
chunk_id: chunkId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
@ -1,482 +0,0 @@
|
|||||||
import { IReferenceChunk } from '@/interfaces/database/chat';
|
|
||||||
import { IDocumentInfo } from '@/interfaces/database/document';
|
|
||||||
import { IChunk } from '@/interfaces/database/knowledge';
|
|
||||||
import {
|
|
||||||
IChangeParserConfigRequestBody,
|
|
||||||
IDocumentMetaRequestBody,
|
|
||||||
} from '@/interfaces/request/document';
|
|
||||||
import i18n from '@/locales/config';
|
|
||||||
import kbService, { listDocument } from '@/services/knowledge-service';
|
|
||||||
import api, { api_host } from '@/utils/api';
|
|
||||||
import { buildChunkHighlights } from '@/utils/document-util';
|
|
||||||
import { post } from '@/utils/request';
|
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
||||||
import { UploadFile, message } from 'antd';
|
|
||||||
import { get } from 'lodash';
|
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
|
||||||
import { IHighlight } from 'react-pdf-highlighter';
|
|
||||||
import { useParams } from 'umi';
|
|
||||||
import {
|
|
||||||
useGetPaginationWithRouter,
|
|
||||||
useHandleSearchChange,
|
|
||||||
} from './logic-hooks';
|
|
||||||
import {
|
|
||||||
useGetKnowledgeSearchParams,
|
|
||||||
useSetPaginationParams,
|
|
||||||
} from './route-hook';
|
|
||||||
|
|
||||||
export const useGetDocumentUrl = (documentId?: string) => {
|
|
||||||
const getDocumentUrl = useCallback(
|
|
||||||
(id?: string) => {
|
|
||||||
return `${api_host}/document/get/${documentId || id}`;
|
|
||||||
},
|
|
||||||
[documentId],
|
|
||||||
);
|
|
||||||
|
|
||||||
return getDocumentUrl;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useGetChunkHighlights = (
|
|
||||||
selectedChunk: IChunk | IReferenceChunk,
|
|
||||||
) => {
|
|
||||||
const [size, setSize] = useState({ width: 849, height: 1200 });
|
|
||||||
|
|
||||||
const highlights: IHighlight[] = useMemo(() => {
|
|
||||||
return buildChunkHighlights(selectedChunk, size);
|
|
||||||
}, [selectedChunk, size]);
|
|
||||||
|
|
||||||
const setWidthAndHeight = (width: number, height: number) => {
|
|
||||||
setSize((pre) => {
|
|
||||||
if (pre.height !== height || pre.width !== width) {
|
|
||||||
return { height, width };
|
|
||||||
}
|
|
||||||
return pre;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return { highlights, setWidthAndHeight };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchNextDocumentList = () => {
|
|
||||||
const { knowledgeId } = useGetKnowledgeSearchParams();
|
|
||||||
const { searchString, handleInputChange } = useHandleSearchChange();
|
|
||||||
const { pagination, setPagination } = useGetPaginationWithRouter();
|
|
||||||
const { id } = useParams();
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery<{
|
|
||||||
docs: IDocumentInfo[];
|
|
||||||
total: number;
|
|
||||||
}>({
|
|
||||||
queryKey: ['fetchDocumentList', searchString, pagination],
|
|
||||||
initialData: { docs: [], total: 0 },
|
|
||||||
refetchInterval: 15000,
|
|
||||||
enabled: !!knowledgeId || !!id,
|
|
||||||
queryFn: async () => {
|
|
||||||
const ret = await listDocument({
|
|
||||||
kb_id: knowledgeId || id,
|
|
||||||
keywords: searchString,
|
|
||||||
page_size: pagination.pageSize,
|
|
||||||
page: pagination.current,
|
|
||||||
});
|
|
||||||
if (ret.data.code === 0) {
|
|
||||||
return ret.data.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
docs: [],
|
|
||||||
total: 0,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(
|
|
||||||
(e) => {
|
|
||||||
setPagination({ page: 1 });
|
|
||||||
handleInputChange(e);
|
|
||||||
},
|
|
||||||
[handleInputChange, setPagination],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
loading,
|
|
||||||
searchString,
|
|
||||||
documents: data.docs,
|
|
||||||
pagination: { ...pagination, total: data?.total },
|
|
||||||
handleInputChange: onInputChange,
|
|
||||||
setPagination,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSetNextDocumentStatus = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['updateDocumentStatus'],
|
|
||||||
mutationFn: async ({
|
|
||||||
status,
|
|
||||||
documentId,
|
|
||||||
}: {
|
|
||||||
status: boolean;
|
|
||||||
documentId: string | string[];
|
|
||||||
}) => {
|
|
||||||
const ids = Array.isArray(documentId) ? documentId : [documentId];
|
|
||||||
const { data } = await kbService.document_change_status({
|
|
||||||
doc_ids: ids,
|
|
||||||
status: Number(status),
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t('message.modified'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { setDocumentStatus: mutateAsync, data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSaveNextDocumentName = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['saveDocumentName'],
|
|
||||||
mutationFn: async ({
|
|
||||||
name,
|
|
||||||
documentId,
|
|
||||||
}: {
|
|
||||||
name: string;
|
|
||||||
documentId: string;
|
|
||||||
}) => {
|
|
||||||
const { data } = await kbService.document_rename({
|
|
||||||
doc_id: documentId,
|
|
||||||
name: name,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t('message.renamed'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { loading, saveName: mutateAsync, data };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useCreateNextDocument = () => {
|
|
||||||
const { knowledgeId } = useGetKnowledgeSearchParams();
|
|
||||||
const { setPaginationParams, page } = useSetPaginationParams();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['createDocument'],
|
|
||||||
mutationFn: async (name: string) => {
|
|
||||||
const { data } = await kbService.document_create({
|
|
||||||
name,
|
|
||||||
kb_id: knowledgeId,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
if (page === 1) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
} else {
|
|
||||||
setPaginationParams(); // fetch document list
|
|
||||||
}
|
|
||||||
|
|
||||||
message.success(i18n.t('message.created'));
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { createDocument: mutateAsync, loading, data };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSetNextDocumentParser = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['setDocumentParser'],
|
|
||||||
mutationFn: async ({
|
|
||||||
parserId,
|
|
||||||
documentId,
|
|
||||||
parserConfig,
|
|
||||||
}: {
|
|
||||||
parserId: string;
|
|
||||||
documentId: string;
|
|
||||||
parserConfig: IChangeParserConfigRequestBody;
|
|
||||||
}) => {
|
|
||||||
const { data } = await kbService.document_change_parser({
|
|
||||||
parser_id: parserId,
|
|
||||||
doc_id: documentId,
|
|
||||||
parser_config: parserConfig,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
|
|
||||||
message.success(i18n.t('message.modified'));
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { setDocumentParser: mutateAsync, data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useUploadNextDocument = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { knowledgeId } = useGetKnowledgeSearchParams();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['uploadDocument'],
|
|
||||||
mutationFn: async (fileList: UploadFile[]) => {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('kb_id', knowledgeId);
|
|
||||||
fileList.forEach((file: any) => {
|
|
||||||
formData.append('file', file);
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const ret = await kbService.document_upload(formData);
|
|
||||||
const code = get(ret, 'data.code');
|
|
||||||
|
|
||||||
if (code === 0 || code === 500) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
}
|
|
||||||
return ret?.data;
|
|
||||||
} catch (error) {
|
|
||||||
console.warn(error);
|
|
||||||
return {
|
|
||||||
code: 500,
|
|
||||||
message: error + '',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { uploadDocument: mutateAsync, loading, data };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useNextWebCrawl = () => {
|
|
||||||
const { knowledgeId } = useGetKnowledgeSearchParams();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['webCrawl'],
|
|
||||||
mutationFn: async ({ name, url }: { name: string; url: string }) => {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('name', name);
|
|
||||||
formData.append('url', url);
|
|
||||||
formData.append('kb_id', knowledgeId);
|
|
||||||
|
|
||||||
const ret = await kbService.web_crawl(formData);
|
|
||||||
const code = get(ret, 'data.code');
|
|
||||||
if (code === 0) {
|
|
||||||
message.success(i18n.t('message.uploaded'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
data,
|
|
||||||
loading,
|
|
||||||
webCrawl: mutateAsync,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRunNextDocument = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['runDocumentByIds'],
|
|
||||||
mutationFn: async ({
|
|
||||||
documentIds,
|
|
||||||
run,
|
|
||||||
shouldDelete,
|
|
||||||
}: {
|
|
||||||
documentIds: string[];
|
|
||||||
run: number;
|
|
||||||
shouldDelete: boolean;
|
|
||||||
}) => {
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: ['fetchDocumentList'],
|
|
||||||
});
|
|
||||||
|
|
||||||
const ret = await kbService.document_run({
|
|
||||||
doc_ids: documentIds,
|
|
||||||
run,
|
|
||||||
delete: shouldDelete,
|
|
||||||
});
|
|
||||||
const code = get(ret, 'data.code');
|
|
||||||
if (code === 0) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
message.success(i18n.t('message.operated'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { runDocumentByIds: mutateAsync, loading, data };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchDocumentInfosByIds = () => {
|
|
||||||
const [ids, setDocumentIds] = useState<string[]>([]);
|
|
||||||
|
|
||||||
const idList = useMemo(() => {
|
|
||||||
return ids.filter((x) => typeof x === 'string' && x !== '');
|
|
||||||
}, [ids]);
|
|
||||||
|
|
||||||
const { data } = useQuery<IDocumentInfo[]>({
|
|
||||||
queryKey: ['fetchDocumentInfos', idList],
|
|
||||||
enabled: idList.length > 0,
|
|
||||||
initialData: [],
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await kbService.document_infos({ doc_ids: idList });
|
|
||||||
if (data.code === 0) {
|
|
||||||
return data.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, setDocumentIds };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchDocumentThumbnailsByIds = () => {
|
|
||||||
const [ids, setDocumentIds] = useState<string[]>([]);
|
|
||||||
const { data } = useQuery<Record<string, string>>({
|
|
||||||
queryKey: ['fetchDocumentThumbnails', ids],
|
|
||||||
enabled: ids.length > 0,
|
|
||||||
initialData: {},
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await kbService.document_thumbnails({ doc_ids: ids });
|
|
||||||
if (data.code === 0) {
|
|
||||||
return data.data;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, setDocumentIds };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRemoveNextDocument = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['removeDocument'],
|
|
||||||
mutationFn: async (documentIds: string | string[]) => {
|
|
||||||
const { data } = await kbService.document_rm({ doc_id: documentIds });
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t('message.deleted'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, removeDocument: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteDocument = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteDocument'],
|
|
||||||
mutationFn: async (documentIds: string[]) => {
|
|
||||||
const data = await kbService.document_delete({ doc_ids: documentIds });
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteDocument: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useParseDocument = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['parseDocument'],
|
|
||||||
mutationFn: async (url: string) => {
|
|
||||||
try {
|
|
||||||
const data = await post(api.parse, { url });
|
|
||||||
if (data?.code === 0) {
|
|
||||||
message.success(i18n.t('message.uploaded'));
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
} catch (error) {
|
|
||||||
message.error('error');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { parseDocument: mutateAsync, data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSetDocumentMeta = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['setDocumentMeta'],
|
|
||||||
mutationFn: async (params: IDocumentMetaRequestBody) => {
|
|
||||||
try {
|
|
||||||
const { data } = await kbService.setMeta({
|
|
||||||
meta: params.meta,
|
|
||||||
doc_id: params.documentId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (data?.code === 0) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
|
|
||||||
|
|
||||||
message.success(i18n.t('message.modified'));
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
} catch (error) {
|
|
||||||
message.error('error');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { setDocumentMeta: mutateAsync, data, loading };
|
|
||||||
};
|
|
||||||
@ -1,293 +0,0 @@
|
|||||||
import message from '@/components/ui/message';
|
|
||||||
import { ResponseType } from '@/interfaces/database/base';
|
|
||||||
import { IFolder } from '@/interfaces/database/file-manager';
|
|
||||||
import { IConnectRequestBody } from '@/interfaces/request/file-manager';
|
|
||||||
import fileManagerService from '@/services/file-manager-service';
|
|
||||||
import { downloadFileFromBlob } from '@/utils/file-util';
|
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
||||||
import { PaginationProps, UploadFile } from 'antd';
|
|
||||||
import React, { useCallback } from 'react';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { useSearchParams } from 'umi';
|
|
||||||
import {
|
|
||||||
useGetPaginationWithRouter,
|
|
||||||
useHandleSearchChange,
|
|
||||||
} from './logic-hooks';
|
|
||||||
import { useSetPaginationParams } from './route-hook';
|
|
||||||
|
|
||||||
export const useGetFolderId = () => {
|
|
||||||
const [searchParams] = useSearchParams();
|
|
||||||
const id = searchParams.get('folderId') as string;
|
|
||||||
|
|
||||||
return id ?? '';
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface IListResult {
|
|
||||||
searchString: string;
|
|
||||||
handleInputChange: React.ChangeEventHandler<HTMLInputElement>;
|
|
||||||
pagination: PaginationProps;
|
|
||||||
setPagination: (pagination: { page: number; pageSize: number }) => void;
|
|
||||||
loading: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useFetchPureFileList = () => {
|
|
||||||
const { mutateAsync, isPending: loading } = useMutation({
|
|
||||||
mutationKey: ['fetchPureFileList'],
|
|
||||||
gcTime: 0,
|
|
||||||
|
|
||||||
mutationFn: async (parentId: string) => {
|
|
||||||
const { data } = await fileManagerService.listFile({
|
|
||||||
parent_id: parentId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { loading, fetchList: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchFileList = (): ResponseType<any> & IListResult => {
|
|
||||||
const { searchString, handleInputChange } = useHandleSearchChange();
|
|
||||||
const { pagination, setPagination } = useGetPaginationWithRouter();
|
|
||||||
const id = useGetFolderId();
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: [
|
|
||||||
'fetchFileList',
|
|
||||||
{
|
|
||||||
id,
|
|
||||||
searchString,
|
|
||||||
...pagination,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
initialData: {},
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await fileManagerService.listFile({
|
|
||||||
parent_id: id,
|
|
||||||
keywords: searchString,
|
|
||||||
page_size: pagination.pageSize,
|
|
||||||
page: pagination.current,
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(
|
|
||||||
(e) => {
|
|
||||||
setPagination({ page: 1 });
|
|
||||||
handleInputChange(e);
|
|
||||||
},
|
|
||||||
[handleInputChange, setPagination],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
...data,
|
|
||||||
searchString,
|
|
||||||
handleInputChange: onInputChange,
|
|
||||||
pagination: { ...pagination, total: data?.data?.total },
|
|
||||||
setPagination,
|
|
||||||
loading,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteFile = () => {
|
|
||||||
const { setPaginationParams } = useSetPaginationParams();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteFile'],
|
|
||||||
mutationFn: async (params: { fileIds: string[]; parentId: string }) => {
|
|
||||||
const { data } = await fileManagerService.removeFile(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
setPaginationParams(1); // TODO: There should be a better way to paginate the request list
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteFile: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDownloadFile = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['downloadFile'],
|
|
||||||
mutationFn: async (params: { id: string; filename?: string }) => {
|
|
||||||
const response = await fileManagerService.getFile({}, params.id);
|
|
||||||
const blob = new Blob([response.data], { type: response.data.type });
|
|
||||||
downloadFileFromBlob(blob, params.filename);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
return { data, loading, downloadFile: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRenameFile = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['renameFile'],
|
|
||||||
mutationFn: async (params: { fileId: string; name: string }) => {
|
|
||||||
const { data } = await fileManagerService.renameFile(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.renamed'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, renameFile: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchParentFolderList = (): IFolder[] => {
|
|
||||||
const id = useGetFolderId();
|
|
||||||
const { data } = useQuery({
|
|
||||||
queryKey: ['fetchParentFolderList', id],
|
|
||||||
initialData: [],
|
|
||||||
enabled: !!id,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await fileManagerService.getAllParentFolder({
|
|
||||||
fileId: id,
|
|
||||||
});
|
|
||||||
|
|
||||||
return data?.data?.parent_folders?.toReversed() ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useCreateFolder = () => {
|
|
||||||
const { setPaginationParams } = useSetPaginationParams();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['createFolder'],
|
|
||||||
mutationFn: async (params: { parentId: string; name: string }) => {
|
|
||||||
const { data } = await fileManagerService.createFolder({
|
|
||||||
...params,
|
|
||||||
type: 'folder',
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.created'));
|
|
||||||
setPaginationParams(1);
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, createFolder: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useUploadFile = () => {
|
|
||||||
const { setPaginationParams } = useSetPaginationParams();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['uploadFile'],
|
|
||||||
mutationFn: async (params: {
|
|
||||||
fileList: UploadFile[];
|
|
||||||
parentId: string;
|
|
||||||
}) => {
|
|
||||||
const fileList = params.fileList;
|
|
||||||
const pathList = params.fileList.map(
|
|
||||||
(file) => (file as any).webkitRelativePath,
|
|
||||||
);
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('parent_id', params.parentId);
|
|
||||||
fileList.forEach((file: any, index: number) => {
|
|
||||||
formData.append('file', file);
|
|
||||||
formData.append('path', pathList[index]);
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
const ret = await fileManagerService.uploadFile(formData);
|
|
||||||
if (ret?.data.code === 0) {
|
|
||||||
message.success(t('message.uploaded'));
|
|
||||||
setPaginationParams(1);
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return ret?.data?.code;
|
|
||||||
} catch (error) {
|
|
||||||
console.log('🚀 ~ useUploadFile ~ error:', error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, uploadFile: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useConnectToKnowledge = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['connectFileToKnowledge'],
|
|
||||||
mutationFn: async (params: IConnectRequestBody) => {
|
|
||||||
const { data } = await fileManagerService.connectFileToKnowledge(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.operated'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, connectFileToKnowledge: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface IMoveFileBody {
|
|
||||||
src_file_ids: string[];
|
|
||||||
dest_file_id: string; // target folder id
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useMoveFile = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['moveFile'],
|
|
||||||
mutationFn: async (params: IMoveFileBody) => {
|
|
||||||
const { data } = await fileManagerService.moveFile(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.operated'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFileList'] });
|
|
||||||
}
|
|
||||||
return data.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, moveFile: mutateAsync };
|
|
||||||
};
|
|
||||||
@ -1,316 +0,0 @@
|
|||||||
import { DSL, IFlow } from '@/interfaces/database/flow';
|
|
||||||
import { IDebugSingleRequestBody } from '@/interfaces/request/flow';
|
|
||||||
import i18n from '@/locales/config';
|
|
||||||
import { useGetSharedChatSearchParams } from '@/pages/next-chats/hooks/use-send-shared-message';
|
|
||||||
import flowService from '@/services/flow-service';
|
|
||||||
import { buildMessageListWithUuid } from '@/utils/chat';
|
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
||||||
import { message } from 'antd';
|
|
||||||
import { set } from 'lodash';
|
|
||||||
import get from 'lodash/get';
|
|
||||||
import { useParams } from 'umi';
|
|
||||||
|
|
||||||
export const useFetchFlowList = (): { data: IFlow[]; loading: boolean } => {
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: ['fetchFlowList'],
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await flowService.listCanvas();
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchListVersion = (
|
|
||||||
canvas_id: string,
|
|
||||||
): {
|
|
||||||
data: {
|
|
||||||
created_at: string;
|
|
||||||
title: string;
|
|
||||||
id: string;
|
|
||||||
}[];
|
|
||||||
loading: boolean;
|
|
||||||
} => {
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: ['fetchListVersion'],
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await flowService.getListVersion({}, canvas_id);
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchVersion = (
|
|
||||||
version_id?: string,
|
|
||||||
): {
|
|
||||||
data?: IFlow;
|
|
||||||
loading: boolean;
|
|
||||||
} => {
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: ['fetchVersion', version_id],
|
|
||||||
initialData: undefined,
|
|
||||||
gcTime: 0,
|
|
||||||
enabled: !!version_id, // Only call API when both values are provided
|
|
||||||
queryFn: async () => {
|
|
||||||
if (!version_id) return undefined;
|
|
||||||
|
|
||||||
const { data } = await flowService.getVersion({}, version_id);
|
|
||||||
|
|
||||||
return data?.data ?? undefined;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchFlow = (): {
|
|
||||||
data: IFlow;
|
|
||||||
loading: boolean;
|
|
||||||
refetch: () => void;
|
|
||||||
} => {
|
|
||||||
const { id } = useParams();
|
|
||||||
const { sharedId } = useGetSharedChatSearchParams();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isFetching: loading,
|
|
||||||
refetch,
|
|
||||||
} = useQuery({
|
|
||||||
queryKey: ['flowDetail'],
|
|
||||||
initialData: {} as IFlow,
|
|
||||||
refetchOnReconnect: false,
|
|
||||||
refetchOnMount: false,
|
|
||||||
refetchOnWindowFocus: false,
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await flowService.getCanvas({}, sharedId || id);
|
|
||||||
|
|
||||||
const messageList = buildMessageListWithUuid(
|
|
||||||
get(data, 'data.dsl.messages', []),
|
|
||||||
);
|
|
||||||
set(data, 'data.dsl.messages', messageList);
|
|
||||||
|
|
||||||
return data?.data ?? {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, refetch };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSettingFlow = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['SettingFlow'],
|
|
||||||
mutationFn: async (params: any) => {
|
|
||||||
const ret = await flowService.settingCanvas(params);
|
|
||||||
if (ret?.data?.code === 0) {
|
|
||||||
message.success('success');
|
|
||||||
} else {
|
|
||||||
message.error(ret?.data?.data);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, settingFlow: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchFlowSSE = (): {
|
|
||||||
data: IFlow;
|
|
||||||
loading: boolean;
|
|
||||||
refetch: () => void;
|
|
||||||
} => {
|
|
||||||
const { sharedId } = useGetSharedChatSearchParams();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isFetching: loading,
|
|
||||||
refetch,
|
|
||||||
} = useQuery({
|
|
||||||
queryKey: ['flowDetailSSE'],
|
|
||||||
initialData: {} as IFlow,
|
|
||||||
refetchOnReconnect: false,
|
|
||||||
refetchOnMount: false,
|
|
||||||
refetchOnWindowFocus: false,
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
if (!sharedId) return {};
|
|
||||||
const { data } = await flowService.getCanvasSSE({}, sharedId);
|
|
||||||
|
|
||||||
const messageList = buildMessageListWithUuid(
|
|
||||||
get(data, 'data.dsl.messages', []),
|
|
||||||
);
|
|
||||||
set(data, 'data.dsl.messages', messageList);
|
|
||||||
|
|
||||||
return data?.data ?? {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, refetch };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSetFlow = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['setFlow'],
|
|
||||||
mutationFn: async (params: {
|
|
||||||
id?: string;
|
|
||||||
title?: string;
|
|
||||||
dsl?: DSL;
|
|
||||||
avatar?: string;
|
|
||||||
}) => {
|
|
||||||
const { data = {} } = await flowService.setCanvas(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(
|
|
||||||
i18n.t(`message.${params?.id ? 'modified' : 'created'}`),
|
|
||||||
);
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] });
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, setFlow: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteFlow = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteFlow'],
|
|
||||||
mutationFn: async (canvasIds: string[]) => {
|
|
||||||
const { data } = await flowService.removeCanvas({ canvasIds });
|
|
||||||
if (data.code === 0) {
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: ['infiniteFetchFlowListTeam'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteFlow: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRunFlow = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['runFlow'],
|
|
||||||
mutationFn: async (params: { id: string; dsl: DSL }) => {
|
|
||||||
const { data } = await flowService.runCanvas(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t(`message.modified`));
|
|
||||||
}
|
|
||||||
return data?.data ?? {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, runFlow: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useResetFlow = () => {
|
|
||||||
const { id } = useParams();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['resetFlow'],
|
|
||||||
mutationFn: async () => {
|
|
||||||
const { data } = await flowService.resetCanvas({ id });
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, resetFlow: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useTestDbConnect = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['testDbConnect'],
|
|
||||||
mutationFn: async (params: any) => {
|
|
||||||
const ret = await flowService.testDbConnect(params);
|
|
||||||
if (ret?.data?.code === 0) {
|
|
||||||
message.success(ret?.data?.data);
|
|
||||||
} else {
|
|
||||||
message.error(ret?.data?.data);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, testDbConnect: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchInputElements = (componentId?: string) => {
|
|
||||||
const { id } = useParams();
|
|
||||||
|
|
||||||
const { data, isPending: loading } = useQuery({
|
|
||||||
queryKey: ['fetchInputElements', id, componentId],
|
|
||||||
initialData: [],
|
|
||||||
enabled: !!id && !!componentId,
|
|
||||||
retryOnMount: false,
|
|
||||||
refetchOnWindowFocus: false,
|
|
||||||
refetchOnReconnect: false,
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const { data } = await flowService.getInputElements({
|
|
||||||
id,
|
|
||||||
component_id: componentId,
|
|
||||||
});
|
|
||||||
return data?.data ?? [];
|
|
||||||
} catch (error) {
|
|
||||||
console.log('🚀 ~ queryFn: ~ error:', error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDebugSingle = () => {
|
|
||||||
const { id } = useParams();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['debugSingle'],
|
|
||||||
mutationFn: async (params: IDebugSingleRequestBody) => {
|
|
||||||
const ret = await flowService.debugSingle({ id, ...params });
|
|
||||||
if (ret?.data?.code !== 0) {
|
|
||||||
message.error(ret?.data?.message);
|
|
||||||
}
|
|
||||||
return ret?.data?.data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, debugSingle: mutateAsync };
|
|
||||||
};
|
|
||||||
@ -1,498 +0,0 @@
|
|||||||
import { ResponsePostType } from '@/interfaces/database/base';
|
|
||||||
import {
|
|
||||||
IKnowledge,
|
|
||||||
IKnowledgeGraph,
|
|
||||||
IRenameTag,
|
|
||||||
ITestingResult,
|
|
||||||
} from '@/interfaces/database/knowledge';
|
|
||||||
import i18n from '@/locales/config';
|
|
||||||
import kbService, {
|
|
||||||
deleteKnowledgeGraph,
|
|
||||||
getKnowledgeGraph,
|
|
||||||
listDataset,
|
|
||||||
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 { useState } from 'react';
|
|
||||||
import { useParams, useSearchParams } from 'umi';
|
|
||||||
import { useHandleSearchChange } from './logic-hooks';
|
|
||||||
import { useSetPaginationParams } from './route-hook';
|
|
||||||
|
|
||||||
export const useKnowledgeBaseId = (): string => {
|
|
||||||
const [searchParams] = useSearchParams();
|
|
||||||
const { id } = useParams();
|
|
||||||
const knowledgeBaseId = searchParams.get('id') || id;
|
|
||||||
|
|
||||||
return knowledgeBaseId || '';
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchKnowledgeBaseConfiguration = () => {
|
|
||||||
const knowledgeBaseId = useKnowledgeBaseId();
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery<IKnowledge>({
|
|
||||||
queryKey: ['fetchKnowledgeDetail'],
|
|
||||||
initialData: {} as IKnowledge,
|
|
||||||
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 listDataset();
|
|
||||||
const list = data?.data?.kbs ?? [];
|
|
||||||
return shouldFilterListWithoutDocument
|
|
||||||
? list.filter((x: IKnowledge) => x.chunk_num > 0)
|
|
||||||
: list;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { list: data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSelectKnowledgeOptions = () => {
|
|
||||||
const { list } = useFetchKnowledgeList();
|
|
||||||
|
|
||||||
const options = list?.map((item) => ({
|
|
||||||
label: item.name,
|
|
||||||
value: item.id,
|
|
||||||
}));
|
|
||||||
|
|
||||||
return options;
|
|
||||||
};
|
|
||||||
|
|
||||||
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 listDataset({
|
|
||||||
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: ['infiniteFetchKnowledgeList'],
|
|
||||||
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 = (shouldFetchList = false) => {
|
|
||||||
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: params?.kb_id ? params?.kb_id : knowledgeBaseId,
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t(`message.updated`));
|
|
||||||
if (shouldFetchList) {
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: ['fetchKnowledgeListByPage'],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
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 {
|
|
||||||
...res,
|
|
||||||
documents: res.doc_aggs,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
data?.data ?? {
|
|
||||||
chunks: [],
|
|
||||||
documents: [],
|
|
||||||
total: 0,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
data: data ?? { chunks: [], documents: [], total: 0 },
|
|
||||||
loading,
|
|
||||||
testChunk: mutateAsync,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useTestChunkAllRetrieval = (): ResponsePostType<ITestingResult> & {
|
|
||||||
testChunkAll: (...params: any[]) => void;
|
|
||||||
} => {
|
|
||||||
const knowledgeBaseId = useKnowledgeBaseId();
|
|
||||||
const { page, size: pageSize } = useSetPaginationParams();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['testChunkAll'], // This method is invalid
|
|
||||||
gcTime: 0,
|
|
||||||
mutationFn: async (values: any) => {
|
|
||||||
const { data } = await kbService.retrieval_test({
|
|
||||||
...values,
|
|
||||||
kb_id: values.kb_id ?? knowledgeBaseId,
|
|
||||||
doc_ids: [],
|
|
||||||
page,
|
|
||||||
size: pageSize,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
const res = data.data;
|
|
||||||
return {
|
|
||||||
...res,
|
|
||||||
documents: res.doc_aggs,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
data?.data ?? {
|
|
||||||
chunks: [],
|
|
||||||
documents: [],
|
|
||||||
total: 0,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
data: data ?? { chunks: [], documents: [], total: 0 },
|
|
||||||
loading,
|
|
||||||
testChunkAll: 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';
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useAllTestingSuccess = () => {
|
|
||||||
const status = useMutationState({
|
|
||||||
filters: { mutationKey: ['testChunkAll'] },
|
|
||||||
select: (mutation) => {
|
|
||||||
return mutation.state.status;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
return status.at(-1) === 'success';
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useAllTestingResult = (): ITestingResult => {
|
|
||||||
const data = useMutationState({
|
|
||||||
filters: { mutationKey: ['testChunkAll'] },
|
|
||||||
select: (mutation) => {
|
|
||||||
return mutation.state.data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
return (data.at(-1) ?? {
|
|
||||||
chunks: [],
|
|
||||||
documents: [],
|
|
||||||
total: 0,
|
|
||||||
}) as ITestingResult;
|
|
||||||
};
|
|
||||||
//#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;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchTagListByKnowledgeIds = () => {
|
|
||||||
const [knowledgeIds, setKnowledgeIds] = useState<string[]>([]);
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery<Array<[string, number]>>({
|
|
||||||
queryKey: ['fetchTagListByKnowledgeIds'],
|
|
||||||
enabled: knowledgeIds.length > 0,
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await kbService.listTagByKnowledgeIds({
|
|
||||||
kb_ids: knowledgeIds.join(','),
|
|
||||||
});
|
|
||||||
const list = data?.data || [];
|
|
||||||
return list;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { list: data, loading, setKnowledgeIds };
|
|
||||||
};
|
|
||||||
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
export function useFetchKnowledgeGraph() {
|
|
||||||
const knowledgeBaseId = useKnowledgeBaseId();
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery<IKnowledgeGraph>({
|
|
||||||
queryKey: ['fetchKnowledgeGraph', knowledgeBaseId],
|
|
||||||
initialData: { graph: {}, mind_map: {} } as IKnowledgeGraph,
|
|
||||||
enabled: !!knowledgeBaseId,
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await getKnowledgeGraph(knowledgeBaseId);
|
|
||||||
return data?.data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useRemoveKnowledgeGraph = () => {
|
|
||||||
const knowledgeBaseId = useKnowledgeBaseId();
|
|
||||||
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['removeKnowledgeGraph'],
|
|
||||||
mutationFn: async () => {
|
|
||||||
const { data } = await deleteKnowledgeGraph(knowledgeBaseId);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(i18n.t(`message.deleted`));
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: ['fetchKnowledgeGraph'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, removeKnowledgeGraph: mutateAsync };
|
|
||||||
};
|
|
||||||
@ -29,7 +29,7 @@ import { useTranslation } from 'react-i18next';
|
|||||||
import { v4 as uuid } from 'uuid';
|
import { v4 as uuid } from 'uuid';
|
||||||
import { useTranslate } from './common-hooks';
|
import { useTranslate } from './common-hooks';
|
||||||
import { useSetPaginationParams } from './route-hook';
|
import { useSetPaginationParams } from './route-hook';
|
||||||
import { useFetchTenantInfo, useSaveSetting } from './user-setting-hooks';
|
import { useFetchTenantInfo, useSaveSetting } from './use-user-setting-request';
|
||||||
|
|
||||||
export function usePrevious<T>(value: T) {
|
export function usePrevious<T>(value: T) {
|
||||||
const ref = useRef<T>();
|
const ref = useRef<T>();
|
||||||
|
|||||||
@ -752,3 +752,37 @@ export function useCancelConversation() {
|
|||||||
|
|
||||||
return { data, loading, cancelConversation: mutateAsync };
|
return { data, loading, cancelConversation: mutateAsync };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const useFetchFlowSSE = (): {
|
||||||
|
data: IFlow;
|
||||||
|
loading: boolean;
|
||||||
|
refetch: () => void;
|
||||||
|
} => {
|
||||||
|
const { sharedId } = useGetSharedChatSearchParams();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isFetching: loading,
|
||||||
|
refetch,
|
||||||
|
} = useQuery({
|
||||||
|
queryKey: ['flowDetailSSE'],
|
||||||
|
initialData: {} as IFlow,
|
||||||
|
refetchOnReconnect: false,
|
||||||
|
refetchOnMount: false,
|
||||||
|
refetchOnWindowFocus: false,
|
||||||
|
gcTime: 0,
|
||||||
|
queryFn: async () => {
|
||||||
|
if (!sharedId) return {};
|
||||||
|
const { data } = await agentService.getCanvasSSE(sharedId);
|
||||||
|
|
||||||
|
const messageList = buildMessageListWithUuid(
|
||||||
|
get(data, 'data.dsl.messages', []),
|
||||||
|
);
|
||||||
|
set(data, 'data.dsl.messages', messageList);
|
||||||
|
|
||||||
|
return data?.data ?? {};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, loading, refetch };
|
||||||
|
};
|
||||||
|
|||||||
@ -459,7 +459,7 @@ export function useUploadAndParseFile() {
|
|||||||
|
|
||||||
const { data } = await chatService.uploadAndParse(
|
const { data } = await chatService.uploadAndParse(
|
||||||
{
|
{
|
||||||
url: api.upload_and_parse(conversationId || id),
|
url: api.upload_and_parse,
|
||||||
signal: controller.current.signal,
|
signal: controller.current.signal,
|
||||||
data: formData,
|
data: formData,
|
||||||
onUploadProgress: ({ progress }) => {
|
onUploadProgress: ({ progress }) => {
|
||||||
|
|||||||
@ -1,17 +1,108 @@
|
|||||||
import message from '@/components/ui/message';
|
import { ResponseGetType, ResponseType } from '@/interfaces/database/base';
|
||||||
import { ResponseGetType } from '@/interfaces/database/base';
|
|
||||||
import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge';
|
import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge';
|
||||||
import kbService from '@/services/knowledge-service';
|
import kbService from '@/services/knowledge-service';
|
||||||
import { useMutation, useQuery } from '@tanstack/react-query';
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||||
import { useDebounce } from 'ahooks';
|
import { useDebounce } from 'ahooks';
|
||||||
|
import { PaginationProps, message } from 'antd';
|
||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { IChunkListResult } from './chunk-hooks';
|
|
||||||
import {
|
import {
|
||||||
useGetPaginationWithRouter,
|
useGetPaginationWithRouter,
|
||||||
useHandleSearchChange,
|
useHandleSearchChange,
|
||||||
} from './logic-hooks';
|
} from './logic-hooks';
|
||||||
import { useGetKnowledgeSearchParams } from './route-hook';
|
import {
|
||||||
|
useGetKnowledgeSearchParams,
|
||||||
|
useSetPaginationParams,
|
||||||
|
} from './route-hook';
|
||||||
|
|
||||||
|
export interface IChunkListResult {
|
||||||
|
searchString?: string;
|
||||||
|
handleInputChange?: React.ChangeEventHandler<HTMLInputElement>;
|
||||||
|
pagination: PaginationProps;
|
||||||
|
setPagination?: (pagination: { page: number; pageSize: number }) => void;
|
||||||
|
available: number | undefined;
|
||||||
|
handleSetAvailable: (available: number | undefined) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useSelectChunkList = () => {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
const data = queryClient.getQueriesData<{
|
||||||
|
data: IChunk[];
|
||||||
|
total: number;
|
||||||
|
documentInfo: IKnowledgeFile;
|
||||||
|
}>({ queryKey: ['fetchChunkList'] });
|
||||||
|
|
||||||
|
return data?.at(-1)?.[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useDeleteChunk = () => {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
const { setPaginationParams } = useSetPaginationParams();
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: ['deleteChunk'],
|
||||||
|
mutationFn: async (params: { chunkIds: string[]; doc_id: string }) => {
|
||||||
|
const { data } = await kbService.rm_chunk(params);
|
||||||
|
if (data.code === 0) {
|
||||||
|
setPaginationParams(1);
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] });
|
||||||
|
}
|
||||||
|
return data?.code;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, loading, deleteChunk: mutateAsync };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useCreateChunk = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: ['createChunk'],
|
||||||
|
mutationFn: async (payload: any) => {
|
||||||
|
let service = kbService.create_chunk;
|
||||||
|
if (payload.chunk_id) {
|
||||||
|
service = kbService.set_chunk;
|
||||||
|
}
|
||||||
|
const { data } = await service(payload);
|
||||||
|
if (data.code === 0) {
|
||||||
|
message.success(t('message.created'));
|
||||||
|
setTimeout(() => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] });
|
||||||
|
}, 1000); // Delay to ensure the list is updated
|
||||||
|
}
|
||||||
|
return data?.code;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, loading, createChunk: mutateAsync };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useFetchChunk = (chunkId?: string): ResponseType<any> => {
|
||||||
|
const { data } = useQuery({
|
||||||
|
queryKey: ['fetchChunk'],
|
||||||
|
enabled: !!chunkId,
|
||||||
|
initialData: {},
|
||||||
|
gcTime: 0,
|
||||||
|
queryFn: async () => {
|
||||||
|
const data = await kbService.get_chunk({
|
||||||
|
chunk_id: chunkId,
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
export const useFetchNextChunkList = (
|
export const useFetchNextChunkList = (
|
||||||
enabled = true,
|
enabled = true,
|
||||||
|
|||||||
@ -1,20 +1,27 @@
|
|||||||
import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-filter-submit';
|
import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-filter-submit';
|
||||||
|
import { post } from '@/utils/next-request';
|
||||||
|
|
||||||
import message from '@/components/ui/message';
|
import message from '@/components/ui/message';
|
||||||
import { ResponseType } from '@/interfaces/database/base';
|
import { ResponseType } from '@/interfaces/database/base';
|
||||||
|
import { IReferenceChunk } from '@/interfaces/database/chat';
|
||||||
import {
|
import {
|
||||||
IDocumentInfo,
|
IDocumentInfo,
|
||||||
IDocumentInfoFilter,
|
IDocumentInfoFilter,
|
||||||
} from '@/interfaces/database/document';
|
} from '@/interfaces/database/document';
|
||||||
|
import { IChunk } from '@/interfaces/database/knowledge';
|
||||||
import {
|
import {
|
||||||
IChangeParserConfigRequestBody,
|
IChangeParserConfigRequestBody,
|
||||||
IDocumentMetaRequestBody,
|
IDocumentMetaRequestBody,
|
||||||
} from '@/interfaces/request/document';
|
} from '@/interfaces/request/document';
|
||||||
import i18n from '@/locales/config';
|
import i18n from '@/locales/config';
|
||||||
import kbService, { listDocument } from '@/services/knowledge-service';
|
import kbService, { listDocument } from '@/services/knowledge-service';
|
||||||
|
import api, { api_host } from '@/utils/api';
|
||||||
|
import { buildChunkHighlights } from '@/utils/document-util';
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||||
import { useDebounce } from 'ahooks';
|
import { useDebounce } from 'ahooks';
|
||||||
import { get } from 'lodash';
|
import { get } from 'lodash';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
|
import { IHighlight } from 'react-pdf-highlighter';
|
||||||
import { useParams } from 'umi';
|
import { useParams } from 'umi';
|
||||||
import {
|
import {
|
||||||
useGetPaginationWithRouter,
|
useGetPaginationWithRouter,
|
||||||
@ -36,6 +43,9 @@ export const enum DocumentApiAction {
|
|||||||
SetDocumentMeta = 'setDocumentMeta',
|
SetDocumentMeta = 'setDocumentMeta',
|
||||||
FetchDocumentFilter = 'fetchDocumentFilter',
|
FetchDocumentFilter = 'fetchDocumentFilter',
|
||||||
CreateDocument = 'createDocument',
|
CreateDocument = 'createDocument',
|
||||||
|
WebCrawl = 'webCrawl',
|
||||||
|
FetchDocumentThumbnails = 'fetchDocumentThumbnails',
|
||||||
|
ParseDocument = 'parseDocument',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useUploadNextDocument = () => {
|
export const useUploadNextDocument = () => {
|
||||||
@ -430,3 +440,108 @@ export const useCreateDocument = () => {
|
|||||||
|
|
||||||
return { createDocument: mutateAsync, loading, data };
|
return { createDocument: mutateAsync, loading, data };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useGetDocumentUrl = (documentId?: string) => {
|
||||||
|
const getDocumentUrl = useCallback(
|
||||||
|
(id?: string) => {
|
||||||
|
return `${api_host}/document/get/${documentId || id}`;
|
||||||
|
},
|
||||||
|
[documentId],
|
||||||
|
);
|
||||||
|
|
||||||
|
return getDocumentUrl;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useGetChunkHighlights = (
|
||||||
|
selectedChunk: IChunk | IReferenceChunk,
|
||||||
|
) => {
|
||||||
|
const [size, setSize] = useState({ width: 849, height: 1200 });
|
||||||
|
|
||||||
|
const highlights: IHighlight[] = useMemo(() => {
|
||||||
|
return buildChunkHighlights(selectedChunk, size);
|
||||||
|
}, [selectedChunk, size]);
|
||||||
|
|
||||||
|
const setWidthAndHeight = (width: number, height: number) => {
|
||||||
|
setSize((pre) => {
|
||||||
|
if (pre.height !== height || pre.width !== width) {
|
||||||
|
return { height, width };
|
||||||
|
}
|
||||||
|
return pre;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return { highlights, setWidthAndHeight };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useNextWebCrawl = () => {
|
||||||
|
const { knowledgeId } = useGetKnowledgeSearchParams();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: [DocumentApiAction.WebCrawl],
|
||||||
|
mutationFn: async ({ name, url }: { name: string; url: string }) => {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('name', name);
|
||||||
|
formData.append('url', url);
|
||||||
|
formData.append('kb_id', knowledgeId);
|
||||||
|
|
||||||
|
const ret = await kbService.web_crawl(formData);
|
||||||
|
const code = get(ret, 'data.code');
|
||||||
|
if (code === 0) {
|
||||||
|
message.success(i18n.t('message.uploaded'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
loading,
|
||||||
|
webCrawl: mutateAsync,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useFetchDocumentThumbnailsByIds = () => {
|
||||||
|
const [ids, setDocumentIds] = useState<string[]>([]);
|
||||||
|
const { data } = useQuery<Record<string, string>>({
|
||||||
|
queryKey: [DocumentApiAction.FetchDocumentThumbnails, ids],
|
||||||
|
enabled: ids.length > 0,
|
||||||
|
initialData: {},
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await kbService.document_thumbnails({ doc_ids: ids });
|
||||||
|
if (data.code === 0) {
|
||||||
|
return data.data;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, setDocumentIds };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useParseDocument = () => {
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: [DocumentApiAction.ParseDocument],
|
||||||
|
mutationFn: async (url: string) => {
|
||||||
|
try {
|
||||||
|
const { data } = await post(api.parse, { url });
|
||||||
|
if (data?.code === 0) {
|
||||||
|
message.success(i18n.t('message.uploaded'));
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
message.error('error');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { parseDocument: mutateAsync, data, loading };
|
||||||
|
};
|
||||||
|
|||||||
@ -3,7 +3,9 @@ import {
|
|||||||
IFetchFileListResult,
|
IFetchFileListResult,
|
||||||
IFolder,
|
IFolder,
|
||||||
} from '@/interfaces/database/file-manager';
|
} from '@/interfaces/database/file-manager';
|
||||||
|
import { IConnectRequestBody } from '@/interfaces/request/file-manager';
|
||||||
import fileManagerService from '@/services/file-manager-service';
|
import fileManagerService from '@/services/file-manager-service';
|
||||||
|
import { downloadFileFromBlob } from '@/utils/file-util';
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||||
import { useDebounce } from 'ahooks';
|
import { useDebounce } from 'ahooks';
|
||||||
import { PaginationProps } from 'antd';
|
import { PaginationProps } from 'antd';
|
||||||
@ -23,6 +25,10 @@ export const enum FileApiAction {
|
|||||||
CreateFolder = 'createFolder',
|
CreateFolder = 'createFolder',
|
||||||
FetchParentFolderList = 'fetchParentFolderList',
|
FetchParentFolderList = 'fetchParentFolderList',
|
||||||
DeleteFile = 'deleteFile',
|
DeleteFile = 'deleteFile',
|
||||||
|
DownloadFile = 'downloadFile',
|
||||||
|
RenameFile = 'renameFile',
|
||||||
|
ConnectFileToKnowledge = 'connectFileToKnowledge',
|
||||||
|
FetchPureFileList = 'fetchPureFileList',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useGetFolderId = () => {
|
export const useGetFolderId = () => {
|
||||||
@ -229,3 +235,85 @@ export const useDeleteFile = () => {
|
|||||||
|
|
||||||
return { data, loading, deleteFile: mutateAsync };
|
return { data, loading, deleteFile: mutateAsync };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useDownloadFile = () => {
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: [FileApiAction.DownloadFile],
|
||||||
|
mutationFn: async (params: { id: string; filename?: string }) => {
|
||||||
|
const response = await fileManagerService.getFile({}, params.id);
|
||||||
|
const blob = new Blob([response.data], { type: response.data.type });
|
||||||
|
downloadFileFromBlob(blob, params.filename);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return { data, loading, downloadFile: mutateAsync };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useRenameFile = () => {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: [FileApiAction.RenameFile],
|
||||||
|
mutationFn: async (params: { fileId: string; name: string }) => {
|
||||||
|
const { data } = await fileManagerService.renameFile(params);
|
||||||
|
if (data.code === 0) {
|
||||||
|
message.success(t('message.renamed'));
|
||||||
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: [FileApiAction.FetchFileList],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return data.code;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, loading, renameFile: mutateAsync };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useConnectToKnowledge = () => {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: [FileApiAction.ConnectFileToKnowledge],
|
||||||
|
mutationFn: async (params: IConnectRequestBody) => {
|
||||||
|
const { data } = await fileManagerService.connectFileToKnowledge(params);
|
||||||
|
if (data.code === 0) {
|
||||||
|
message.success(t('message.operated'));
|
||||||
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: [FileApiAction.FetchFileList],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return data.code;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { data, loading, connectFileToKnowledge: mutateAsync };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useFetchPureFileList = () => {
|
||||||
|
const { mutateAsync, isPending: loading } = useMutation({
|
||||||
|
mutationKey: [FileApiAction.FetchPureFileList],
|
||||||
|
gcTime: 0,
|
||||||
|
|
||||||
|
mutationFn: async (parentId: string) => {
|
||||||
|
const { data } = await fileManagerService.listFile({
|
||||||
|
parent_id: parentId,
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { loading, fetchList: mutateAsync };
|
||||||
|
};
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-filter-submit';
|
import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-filter-submit';
|
||||||
import message from '@/components/ui/message';
|
import message from '@/components/ui/message';
|
||||||
|
import { ResponsePostType } from '@/interfaces/database/base';
|
||||||
import {
|
import {
|
||||||
IKnowledge,
|
IKnowledge,
|
||||||
IKnowledgeGraph,
|
IKnowledgeGraph,
|
||||||
IKnowledgeResult,
|
IKnowledgeResult,
|
||||||
INextTestingResult,
|
INextTestingResult,
|
||||||
|
IRenameTag,
|
||||||
|
ITestingResult,
|
||||||
} from '@/interfaces/database/knowledge';
|
} from '@/interfaces/database/knowledge';
|
||||||
import { ITestRetrievalRequestBody } from '@/interfaces/request/knowledge';
|
import { ITestRetrievalRequestBody } from '@/interfaces/request/knowledge';
|
||||||
import i18n from '@/locales/config';
|
import i18n from '@/locales/config';
|
||||||
@ -12,8 +15,17 @@ import kbService, {
|
|||||||
deleteKnowledgeGraph,
|
deleteKnowledgeGraph,
|
||||||
getKnowledgeGraph,
|
getKnowledgeGraph,
|
||||||
listDataset,
|
listDataset,
|
||||||
|
listTag,
|
||||||
|
removeTag,
|
||||||
|
renameTag,
|
||||||
} from '@/services/knowledge-service';
|
} from '@/services/knowledge-service';
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
import {
|
||||||
|
useIsMutating,
|
||||||
|
useMutation,
|
||||||
|
useMutationState,
|
||||||
|
useQuery,
|
||||||
|
useQueryClient,
|
||||||
|
} from '@tanstack/react-query';
|
||||||
import { useDebounce } from 'ahooks';
|
import { useDebounce } from 'ahooks';
|
||||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
import { useParams, useSearchParams } from 'umi';
|
import { useParams, useSearchParams } from 'umi';
|
||||||
@ -21,6 +33,7 @@ import {
|
|||||||
useGetPaginationWithRouter,
|
useGetPaginationWithRouter,
|
||||||
useHandleSearchChange,
|
useHandleSearchChange,
|
||||||
} from './logic-hooks';
|
} from './logic-hooks';
|
||||||
|
import { useSetPaginationParams } from './route-hook';
|
||||||
|
|
||||||
export const enum KnowledgeApiAction {
|
export const enum KnowledgeApiAction {
|
||||||
TestRetrieval = 'testRetrieval',
|
TestRetrieval = 'testRetrieval',
|
||||||
@ -354,3 +367,252 @@ export const useFetchKnowledgeList = (
|
|||||||
|
|
||||||
return { list: data, loading };
|
return { list: data, loading };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useSelectKnowledgeOptions = () => {
|
||||||
|
const { list } = useFetchKnowledgeList();
|
||||||
|
|
||||||
|
const options = list?.map((item) => ({
|
||||||
|
label: item.name,
|
||||||
|
value: item.id,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
|
||||||
|
//#region tags
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useFetchTagListByKnowledgeIds = () => {
|
||||||
|
const [knowledgeIds, setKnowledgeIds] = useState<string[]>([]);
|
||||||
|
|
||||||
|
const { data, isFetching: loading } = useQuery<Array<[string, number]>>({
|
||||||
|
queryKey: ['fetchTagListByKnowledgeIds'],
|
||||||
|
enabled: knowledgeIds.length > 0,
|
||||||
|
initialData: [],
|
||||||
|
gcTime: 0, // https://tanstack.com/query/latest/docs/framework/react/guides/caching?from=reactQueryV3
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await kbService.listTagByKnowledgeIds({
|
||||||
|
kb_ids: knowledgeIds.join(','),
|
||||||
|
});
|
||||||
|
const list = data?.data || [];
|
||||||
|
return list;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return { list: data, loading, setKnowledgeIds };
|
||||||
|
};
|
||||||
|
|
||||||
|
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 };
|
||||||
|
};
|
||||||
|
|
||||||
|
// #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 {
|
||||||
|
...res,
|
||||||
|
documents: res.doc_aggs,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
data?.data ?? {
|
||||||
|
chunks: [],
|
||||||
|
documents: [],
|
||||||
|
total: 0,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data: data ?? { chunks: [], documents: [], total: 0 },
|
||||||
|
loading,
|
||||||
|
testChunk: mutateAsync,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useTestChunkAllRetrieval = (): ResponsePostType<ITestingResult> & {
|
||||||
|
testChunkAll: (...params: any[]) => void;
|
||||||
|
} => {
|
||||||
|
const knowledgeBaseId = useKnowledgeBaseId();
|
||||||
|
const { page, size: pageSize } = useSetPaginationParams();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
isPending: loading,
|
||||||
|
mutateAsync,
|
||||||
|
} = useMutation({
|
||||||
|
mutationKey: ['testChunkAll'], // This method is invalid
|
||||||
|
gcTime: 0,
|
||||||
|
mutationFn: async (values: any) => {
|
||||||
|
const { data } = await kbService.retrieval_test({
|
||||||
|
...values,
|
||||||
|
kb_id: values.kb_id ?? knowledgeBaseId,
|
||||||
|
doc_ids: [],
|
||||||
|
page,
|
||||||
|
size: pageSize,
|
||||||
|
});
|
||||||
|
if (data.code === 0) {
|
||||||
|
const res = data.data;
|
||||||
|
return {
|
||||||
|
...res,
|
||||||
|
documents: res.doc_aggs,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
data?.data ?? {
|
||||||
|
chunks: [],
|
||||||
|
documents: [],
|
||||||
|
total: 0,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
data: data ?? { chunks: [], documents: [], total: 0 },
|
||||||
|
loading,
|
||||||
|
testChunkAll: 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';
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useAllTestingSuccess = () => {
|
||||||
|
const status = useMutationState({
|
||||||
|
filters: { mutationKey: ['testChunkAll'] },
|
||||||
|
select: (mutation) => {
|
||||||
|
return mutation.state.status;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return status.at(-1) === 'success';
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useAllTestingResult = (): ITestingResult => {
|
||||||
|
const data = useMutationState({
|
||||||
|
filters: { mutationKey: ['testChunkAll'] },
|
||||||
|
select: (mutation) => {
|
||||||
|
return mutation.state.data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return (data.at(-1) ?? {
|
||||||
|
chunks: [],
|
||||||
|
documents: [],
|
||||||
|
total: 0,
|
||||||
|
}) as ITestingResult;
|
||||||
|
};
|
||||||
|
//#endregion
|
||||||
|
|||||||
@ -1,47 +0,0 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
|
||||||
import userService from '@/services/user-service';
|
|
||||||
import { useQuery } from '@tanstack/react-query';
|
|
||||||
|
|
||||||
import {
|
|
||||||
IThirdOAIModelCollection as IThirdAiModelCollection,
|
|
||||||
IThirdOAIModel,
|
|
||||||
} from '@/interfaces/database/llm';
|
|
||||||
import { buildLlmUuid } from '@/utils/llm-util';
|
|
||||||
|
|
||||||
export const enum LLMApiAction {
|
|
||||||
LlmList = 'llmList',
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useFetchLlmList = (modelType?: LlmModelType) => {
|
|
||||||
const { data } = useQuery<IThirdAiModelCollection>({
|
|
||||||
queryKey: [LLMApiAction.LlmList],
|
|
||||||
initialData: {},
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await userService.llm_list({ model_type: modelType });
|
|
||||||
|
|
||||||
return data?.data ?? {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
type IThirdOAIModelWithUuid = IThirdOAIModel & { uuid: string };
|
|
||||||
|
|
||||||
export function useSelectFlatLlmList(modelType?: LlmModelType) {
|
|
||||||
const llmList = useFetchLlmList(modelType);
|
|
||||||
|
|
||||||
return Object.values(llmList).reduce<IThirdOAIModelWithUuid[]>((pre, cur) => {
|
|
||||||
pre.push(...cur.map((x) => ({ ...x, uuid: buildLlmUuid(x) })));
|
|
||||||
|
|
||||||
return pre;
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useFindLlmByUuid(modelType?: LlmModelType) {
|
|
||||||
const flatList = useSelectFlatLlmList(modelType);
|
|
||||||
|
|
||||||
return (uuid: string) => {
|
|
||||||
return flatList.find((x) => x.uuid === uuid);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -20,11 +20,15 @@ import { DefaultOptionType } from 'antd/es/select';
|
|||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
export const useFetchLlmList = (
|
import { buildLlmUuid } from '@/utils/llm-util';
|
||||||
modelType?: LlmModelType,
|
|
||||||
): IThirdAiModelCollection => {
|
export const enum LLMApiAction {
|
||||||
const { data } = useQuery({
|
LlmList = 'llmList',
|
||||||
queryKey: ['llmList'],
|
}
|
||||||
|
|
||||||
|
export const useFetchLlmList = (modelType?: LlmModelType) => {
|
||||||
|
const { data } = useQuery<IThirdAiModelCollection>({
|
||||||
|
queryKey: [LLMApiAction.LlmList],
|
||||||
initialData: {},
|
initialData: {},
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const { data } = await userService.llm_list({ model_type: modelType });
|
const { data } = await userService.llm_list({ model_type: modelType });
|
||||||
@ -36,24 +40,25 @@ export const useFetchLlmList = (
|
|||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useSelectLlmOptions = () => {
|
type IThirdOAIModelWithUuid = IThirdOAIModel & { uuid: string };
|
||||||
const llmInfo: IThirdOAIModelCollection = useFetchLlmList();
|
|
||||||
|
|
||||||
const embeddingModelOptions = useMemo(() => {
|
export function useSelectFlatLlmList(modelType?: LlmModelType) {
|
||||||
return Object.entries(llmInfo).map(([key, value]) => {
|
const llmList = useFetchLlmList(modelType);
|
||||||
return {
|
|
||||||
label: key,
|
return Object.values(llmList).reduce<IThirdOAIModelWithUuid[]>((pre, cur) => {
|
||||||
options: value.map((x) => ({
|
pre.push(...cur.map((x) => ({ ...x, uuid: buildLlmUuid(x) })));
|
||||||
label: getRealModelName(x.llm_name),
|
|
||||||
value: `${x.llm_name}@${x.fid}`,
|
return pre;
|
||||||
disabled: !x.available,
|
}, []);
|
||||||
})),
|
}
|
||||||
|
|
||||||
|
export function useFindLlmByUuid(modelType?: LlmModelType) {
|
||||||
|
const flatList = useSelectFlatLlmList(modelType);
|
||||||
|
|
||||||
|
return (uuid: string) => {
|
||||||
|
return flatList.find((x) => x.uuid === uuid);
|
||||||
};
|
};
|
||||||
});
|
}
|
||||||
}, [llmInfo]);
|
|
||||||
|
|
||||||
return embeddingModelOptions;
|
|
||||||
};
|
|
||||||
|
|
||||||
function buildLlmOptionsWithIcon(x: IThirdOAIModel) {
|
function buildLlmOptionsWithIcon(x: IThirdOAIModel) {
|
||||||
return {
|
return {
|
||||||
@ -6,9 +6,6 @@ import userService, {
|
|||||||
} from '@/services/user-service';
|
} from '@/services/user-service';
|
||||||
import authorizationUtil, { redirectToLogin } from '@/utils/authorization-util';
|
import authorizationUtil, { redirectToLogin } from '@/utils/authorization-util';
|
||||||
import { useMutation, useQuery } from '@tanstack/react-query';
|
import { useMutation, useQuery } from '@tanstack/react-query';
|
||||||
import { Form } from 'antd';
|
|
||||||
import { FormInstance } from 'antd/lib';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
export interface ILoginRequestBody {
|
export interface ILoginRequestBody {
|
||||||
@ -134,19 +131,3 @@ export const useLogout = () => {
|
|||||||
|
|
||||||
return { data, loading, logout: mutateAsync };
|
return { data, loading, logout: mutateAsync };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useHandleSubmittable = (form: FormInstance) => {
|
|
||||||
const [submittable, setSubmittable] = useState<boolean>(false);
|
|
||||||
|
|
||||||
// Watch all values
|
|
||||||
const values = Form.useWatch([], form);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
form
|
|
||||||
.validateFields({ validateOnly: true })
|
|
||||||
.then(() => setSubmittable(true))
|
|
||||||
.catch(() => setSubmittable(false));
|
|
||||||
}, [form, values]);
|
|
||||||
|
|
||||||
return { submittable };
|
|
||||||
};
|
|
||||||
@ -1,433 +0,0 @@
|
|||||||
import message from '@/components/ui/message';
|
|
||||||
import { LanguageTranslationMap } from '@/constants/common';
|
|
||||||
import { ResponseGetType } from '@/interfaces/database/base';
|
|
||||||
import { IToken } from '@/interfaces/database/chat';
|
|
||||||
import { ITenantInfo } from '@/interfaces/database/knowledge';
|
|
||||||
import { ILangfuseConfig } from '@/interfaces/database/system';
|
|
||||||
import {
|
|
||||||
ISystemStatus,
|
|
||||||
ITenant,
|
|
||||||
ITenantUser,
|
|
||||||
IUserInfo,
|
|
||||||
} from '@/interfaces/database/user-setting';
|
|
||||||
import { ISetLangfuseConfigRequestBody } from '@/interfaces/request/system';
|
|
||||||
import userService, {
|
|
||||||
addTenantUser,
|
|
||||||
agreeTenant,
|
|
||||||
deleteTenantUser,
|
|
||||||
listTenant,
|
|
||||||
listTenantUser,
|
|
||||||
} from '@/services/user-service';
|
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
||||||
import { Modal } from 'antd';
|
|
||||||
import DOMPurify from 'dompurify';
|
|
||||||
import { isEmpty } from 'lodash';
|
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { history } from 'umi';
|
|
||||||
|
|
||||||
export const useFetchUserInfo = (): ResponseGetType<IUserInfo> => {
|
|
||||||
const { i18n } = useTranslation();
|
|
||||||
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: ['userInfo'],
|
|
||||||
initialData: {},
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await userService.user_info();
|
|
||||||
if (data.code === 0) {
|
|
||||||
i18n.changeLanguage(
|
|
||||||
LanguageTranslationMap[
|
|
||||||
data.data.language as keyof typeof LanguageTranslationMap
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return data?.data ?? {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchTenantInfo = (
|
|
||||||
showEmptyModelWarn = false,
|
|
||||||
): ResponseGetType<ITenantInfo> => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const { data, isFetching: loading } = useQuery({
|
|
||||||
queryKey: ['tenantInfo', showEmptyModelWarn],
|
|
||||||
initialData: {},
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data: res } = await userService.get_tenant_info();
|
|
||||||
if (res.code === 0) {
|
|
||||||
// llm_id is chat_id
|
|
||||||
// asr_id is speech2txt
|
|
||||||
const { data } = res;
|
|
||||||
if (
|
|
||||||
showEmptyModelWarn &&
|
|
||||||
(isEmpty(data.embd_id) || isEmpty(data.llm_id))
|
|
||||||
) {
|
|
||||||
Modal.warning({
|
|
||||||
title: t('common.warn'),
|
|
||||||
content: (
|
|
||||||
<div
|
|
||||||
dangerouslySetInnerHTML={{
|
|
||||||
__html: DOMPurify.sanitize(t('setting.modelProvidersWarn')),
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
),
|
|
||||||
onOk() {
|
|
||||||
history.push('/user-setting/model');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
data.chat_id = data.llm_id;
|
|
||||||
data.speech2text_id = data.asr_id;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSelectParserList = (): Array<{
|
|
||||||
value: string;
|
|
||||||
label: string;
|
|
||||||
}> => {
|
|
||||||
const { data: tenantInfo } = useFetchTenantInfo(true);
|
|
||||||
const parserList = useMemo(() => {
|
|
||||||
const parserArray: Array<string> = tenantInfo?.parser_ids?.split(',') ?? [];
|
|
||||||
return parserArray.map((x) => {
|
|
||||||
const arr = x.split(':');
|
|
||||||
return { value: arr[0], label: arr[1] };
|
|
||||||
});
|
|
||||||
}, [tenantInfo]);
|
|
||||||
|
|
||||||
return parserList;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSaveSetting = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['saveSetting'],
|
|
||||||
mutationFn: async (
|
|
||||||
userInfo: { new_password: string } | Partial<IUserInfo>,
|
|
||||||
) => {
|
|
||||||
const { data } = await userService.setting(userInfo);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.modified'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['userInfo'] });
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, saveSetting: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchSystemVersion = () => {
|
|
||||||
const [version, setVersion] = useState('');
|
|
||||||
const [loading, setLoading] = useState(false);
|
|
||||||
|
|
||||||
const fetchSystemVersion = useCallback(async () => {
|
|
||||||
try {
|
|
||||||
setLoading(true);
|
|
||||||
const { data } = await userService.getSystemVersion();
|
|
||||||
if (data.code === 0) {
|
|
||||||
setVersion(data.data);
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return { fetchSystemVersion, version, loading };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchSystemStatus = () => {
|
|
||||||
const [systemStatus, setSystemStatus] = useState<ISystemStatus>(
|
|
||||||
{} as ISystemStatus,
|
|
||||||
);
|
|
||||||
const [loading, setLoading] = useState(false);
|
|
||||||
|
|
||||||
const fetchSystemStatus = useCallback(async () => {
|
|
||||||
setLoading(true);
|
|
||||||
const { data } = await userService.getSystemStatus();
|
|
||||||
if (data.code === 0) {
|
|
||||||
setSystemStatus(data.data);
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return {
|
|
||||||
systemStatus,
|
|
||||||
fetchSystemStatus,
|
|
||||||
loading,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchManualSystemTokenList = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['fetchManualSystemTokenList'],
|
|
||||||
mutationFn: async () => {
|
|
||||||
const { data } = await userService.listToken();
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, fetchSystemTokenList: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchSystemTokenList = () => {
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isFetching: loading,
|
|
||||||
refetch,
|
|
||||||
} = useQuery<IToken[]>({
|
|
||||||
queryKey: ['fetchSystemTokenList'],
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await userService.listToken();
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, refetch };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRemoveSystemToken = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['removeSystemToken'],
|
|
||||||
mutationFn: async (token: string) => {
|
|
||||||
const { data } = await userService.removeToken({}, token);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.deleted'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
|
|
||||||
}
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, removeToken: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useCreateSystemToken = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['createSystemToken'],
|
|
||||||
mutationFn: async (params: Record<string, any>) => {
|
|
||||||
const { data } = await userService.createToken(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
|
|
||||||
}
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, createToken: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useListTenantUser = () => {
|
|
||||||
const { data: tenantInfo } = useFetchTenantInfo();
|
|
||||||
const tenantId = tenantInfo.tenant_id;
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isFetching: loading,
|
|
||||||
refetch,
|
|
||||||
} = useQuery<ITenantUser[]>({
|
|
||||||
queryKey: ['listTenantUser', tenantId],
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0,
|
|
||||||
enabled: !!tenantId,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await listTenantUser(tenantId);
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, refetch };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useAddTenantUser = () => {
|
|
||||||
const { data: tenantInfo } = useFetchTenantInfo();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['addTenantUser'],
|
|
||||||
mutationFn: async (email: string) => {
|
|
||||||
const { data } = await addTenantUser(tenantInfo.tenant_id, email);
|
|
||||||
if (data.code === 0) {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['listTenantUser'] });
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, addTenantUser: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteTenantUser = () => {
|
|
||||||
const { data: tenantInfo } = useFetchTenantInfo();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteTenantUser'],
|
|
||||||
mutationFn: async ({
|
|
||||||
userId,
|
|
||||||
tenantId,
|
|
||||||
}: {
|
|
||||||
userId: string;
|
|
||||||
tenantId?: string;
|
|
||||||
}) => {
|
|
||||||
const { data } = await deleteTenantUser({
|
|
||||||
tenantId: tenantId ?? tenantInfo.tenant_id,
|
|
||||||
userId,
|
|
||||||
});
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.deleted'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['listTenantUser'] });
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['listTenant'] });
|
|
||||||
}
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteTenantUser: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useListTenant = () => {
|
|
||||||
const { data: tenantInfo } = useFetchTenantInfo();
|
|
||||||
const tenantId = tenantInfo.tenant_id;
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isFetching: loading,
|
|
||||||
refetch,
|
|
||||||
} = useQuery<ITenant[]>({
|
|
||||||
queryKey: ['listTenant', tenantId],
|
|
||||||
initialData: [],
|
|
||||||
gcTime: 0,
|
|
||||||
enabled: !!tenantId,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await listTenant();
|
|
||||||
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, refetch };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useAgreeTenant = () => {
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['agreeTenant'],
|
|
||||||
mutationFn: async (tenantId: string) => {
|
|
||||||
const { data } = await agreeTenant(tenantId);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.operated'));
|
|
||||||
queryClient.invalidateQueries({ queryKey: ['listTenant'] });
|
|
||||||
}
|
|
||||||
return data?.data ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, agreeTenant: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useSetLangfuseConfig = () => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['setLangfuseConfig'],
|
|
||||||
mutationFn: async (params: ISetLangfuseConfigRequestBody) => {
|
|
||||||
const { data } = await userService.setLangfuseConfig(params);
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.operated'));
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, setLangfuseConfig: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useDeleteLangfuseConfig = () => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
isPending: loading,
|
|
||||||
mutateAsync,
|
|
||||||
} = useMutation({
|
|
||||||
mutationKey: ['deleteLangfuseConfig'],
|
|
||||||
mutationFn: async () => {
|
|
||||||
const { data } = await userService.deleteLangfuseConfig();
|
|
||||||
if (data.code === 0) {
|
|
||||||
message.success(t('message.deleted'));
|
|
||||||
}
|
|
||||||
return data?.code;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading, deleteLangfuseConfig: mutateAsync };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFetchLangfuseConfig = () => {
|
|
||||||
const { data, isFetching: loading } = useQuery<ILangfuseConfig>({
|
|
||||||
queryKey: ['fetchLangfuseConfig'],
|
|
||||||
gcTime: 0,
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await userService.getLangfuseConfig();
|
|
||||||
|
|
||||||
return data?.data;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return { data, loading };
|
|
||||||
};
|
|
||||||
@ -8,7 +8,10 @@ import User from '../user';
|
|||||||
import { useTheme } from '@/components/theme-provider';
|
import { useTheme } from '@/components/theme-provider';
|
||||||
import { LanguageList, LanguageMap, ThemeEnum } from '@/constants/common';
|
import { LanguageList, LanguageMap, ThemeEnum } from '@/constants/common';
|
||||||
import { useChangeLanguage } from '@/hooks/logic-hooks';
|
import { useChangeLanguage } from '@/hooks/logic-hooks';
|
||||||
import { useFetchUserInfo, useListTenant } from '@/hooks/user-setting-hooks';
|
import {
|
||||||
|
useFetchUserInfo,
|
||||||
|
useListTenant,
|
||||||
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { TenantRole } from '@/pages/user-setting/constants';
|
import { TenantRole } from '@/pages/user-setting/constants';
|
||||||
import { BellRing, CircleHelp, MoonIcon, SunIcon } from 'lucide-react';
|
import { BellRing, CircleHelp, MoonIcon, SunIcon } from 'lucide-react';
|
||||||
import { useNavigate } from 'umi';
|
import { useNavigate } from 'umi';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { Avatar } from 'antd';
|
import { Avatar } from 'antd';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { history } from 'umi';
|
import { history } from 'umi';
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import { LanguageList, LanguageMap, ThemeEnum } from '@/constants/common';
|
|||||||
import { useChangeLanguage } from '@/hooks/logic-hooks';
|
import { useChangeLanguage } from '@/hooks/logic-hooks';
|
||||||
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
|
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
|
||||||
import { useNavigateWithFromState } from '@/hooks/route-hook';
|
import { useNavigateWithFromState } from '@/hooks/route-hook';
|
||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { Routes } from '@/routes';
|
import { Routes } from '@/routes';
|
||||||
import { camelCase } from 'lodash';
|
import { camelCase } from 'lodash';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { NodeCollapsible } from '@/components/collapse';
|
import { NodeCollapsible } from '@/components/collapse';
|
||||||
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
|
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
|
||||||
import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeList } from '@/hooks/use-knowledge-request';
|
||||||
import { IRetrievalNode } from '@/interfaces/database/flow';
|
import { IRetrievalNode } from '@/interfaces/database/flow';
|
||||||
import { NodeProps, Position } from '@xyflow/react';
|
import { NodeProps, Position } from '@xyflow/react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import {
|
|||||||
useFetchAgent,
|
useFetchAgent,
|
||||||
useUploadCanvasFileWithProgress,
|
useUploadCanvasFileWithProgress,
|
||||||
} from '@/hooks/use-agent-request';
|
} from '@/hooks/use-agent-request';
|
||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { buildMessageUuidWithRole } from '@/utils/chat';
|
import { buildMessageUuidWithRole } from '@/utils/chat';
|
||||||
import { memo, useCallback } from 'react';
|
import { memo, useCallback } from 'react';
|
||||||
import { useParams } from 'umi';
|
import { useParams } from 'umi';
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { Input } from '@/components/ui/input';
|
import { Input } from '@/components/ui/input';
|
||||||
import { Popover, PopoverContent } from '@/components/ui/popover';
|
import { Popover, PopoverContent } from '@/components/ui/popover';
|
||||||
import { useParseDocument } from '@/hooks/document-hooks';
|
import { useParseDocument } from '@/hooks/use-document-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import { PropsWithChildren } from 'react';
|
import { PropsWithChildren } from 'react';
|
||||||
@ -37,7 +37,7 @@ export const PopoverForm = ({
|
|||||||
defaultValues: values,
|
defaultValues: values,
|
||||||
resolver: zodResolver(FormSchema),
|
resolver: zodResolver(FormSchema),
|
||||||
});
|
});
|
||||||
const { parseDocument, loading } = useParseDocument();
|
const { parseDocument } = useParseDocument();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
// useResetFormOnCloseModal({
|
// useResetFormOnCloseModal({
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
|
import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request';
|
||||||
import {
|
import {
|
||||||
LargeModelFormField,
|
LargeModelFormField,
|
||||||
OutputFormatFormFieldProps,
|
OutputFormatFormFieldProps,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import {
|
|||||||
useCreateSystemToken,
|
useCreateSystemToken,
|
||||||
useFetchSystemTokenList,
|
useFetchSystemTokenList,
|
||||||
useRemoveSystemToken,
|
useRemoveSystemToken,
|
||||||
} from '@/hooks/user-setting-hooks';
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { IStats } from '@/interfaces/database/chat';
|
import { IStats } from '@/interfaces/database/chat';
|
||||||
import { useQueryClient } from '@tanstack/react-query';
|
import { useQueryClient } from '@tanstack/react-query';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import MessageItem from '@/components/next-message-item';
|
import MessageItem from '@/components/next-message-item';
|
||||||
import { Modal } from '@/components/ui/modal/modal';
|
import { Modal } from '@/components/ui/modal/modal';
|
||||||
import { useFetchAgent } from '@/hooks/use-agent-request';
|
import { useFetchAgent } from '@/hooks/use-agent-request';
|
||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { IAgentLogMessage } from '@/interfaces/database/agent';
|
import { IAgentLogMessage } from '@/interfaces/database/agent';
|
||||||
import {
|
import {
|
||||||
IMessage,
|
IMessage,
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import { Modal } from '@/components/ui/modal/modal';
|
|||||||
import Space from '@/components/ui/space';
|
import Space from '@/components/ui/space';
|
||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
import { Textarea } from '@/components/ui/textarea';
|
import { Textarea } from '@/components/ui/textarea';
|
||||||
import { useFetchChunk } from '@/hooks/chunk-hooks';
|
import { useFetchChunk } from '@/hooks/use-chunk-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import React, { useCallback, useEffect, useState } from 'react';
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
import { FieldValues, FormProvider, useForm } from 'react-hook-form';
|
import { FieldValues, FormProvider, useForm } from 'react-hook-form';
|
||||||
|
|||||||
@ -8,8 +8,10 @@ import {
|
|||||||
FormMessage,
|
FormMessage,
|
||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { NumberInput } from '@/components/ui/input';
|
import { NumberInput } from '@/components/ui/input';
|
||||||
import { useFetchTagListByKnowledgeIds } from '@/hooks/knowledge-hooks';
|
import {
|
||||||
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
|
useFetchKnowledgeBaseConfiguration,
|
||||||
|
useFetchTagListByKnowledgeIds,
|
||||||
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { CircleMinus, Plus } from 'lucide-react';
|
import { CircleMinus, Plus } from 'lucide-react';
|
||||||
import { useCallback, useEffect, useMemo } from 'react';
|
import { useCallback, useEffect, useMemo } from 'react';
|
||||||
import { useFieldArray, useFormContext } from 'react-hook-form';
|
import { useFieldArray, useFormContext } from 'react-hook-form';
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
import { ReactComponent as FilterIcon } from '@/assets/filter.svg';
|
import { ReactComponent as FilterIcon } from '@/assets/filter.svg';
|
||||||
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
||||||
import { IChunkListResult, useSelectChunkList } from '@/hooks/chunk-hooks';
|
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useKnowledgeBaseId } from '@/hooks/knowledge-hooks';
|
import {
|
||||||
|
IChunkListResult,
|
||||||
|
useSelectChunkList,
|
||||||
|
} from '@/hooks/use-chunk-request';
|
||||||
|
import { useKnowledgeBaseId } from '@/hooks/use-knowledge-request';
|
||||||
import {
|
import {
|
||||||
ArrowLeftOutlined,
|
ArrowLeftOutlined,
|
||||||
CheckCircleOutlined,
|
CheckCircleOutlined,
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
|
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
|
||||||
|
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook';
|
||||||
import {
|
import {
|
||||||
useCreateChunk,
|
useCreateChunk,
|
||||||
useDeleteChunk,
|
useDeleteChunk,
|
||||||
useSelectChunkList,
|
useSelectChunkList,
|
||||||
} from '@/hooks/chunk-hooks';
|
} from '@/hooks/use-chunk-request';
|
||||||
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
|
|
||||||
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook';
|
|
||||||
import { IChunk } from '@/interfaces/database/knowledge';
|
import { IChunk } from '@/interfaces/database/knowledge';
|
||||||
import { buildChunkHighlights } from '@/utils/document-util';
|
import { buildChunkHighlights } from '@/utils/document-util';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { useKnowledgeBaseId } from '@/hooks/knowledge-hooks';
|
|
||||||
import {
|
import {
|
||||||
useNavigateWithFromState,
|
useNavigateWithFromState,
|
||||||
useSecondPathName,
|
useSecondPathName,
|
||||||
useThirdPathName,
|
useThirdPathName,
|
||||||
} from '@/hooks/route-hook';
|
} from '@/hooks/route-hook';
|
||||||
|
import { useKnowledgeBaseId } from '@/hooks/use-knowledge-request';
|
||||||
import { Breadcrumb } from 'antd';
|
import { Breadcrumb } from 'antd';
|
||||||
import { ItemType } from 'antd/es/breadcrumb/Breadcrumb';
|
import { ItemType } from 'antd/es/breadcrumb/Breadcrumb';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import { Modal } from '@/components/ui/modal/modal';
|
|||||||
import Space from '@/components/ui/space';
|
import Space from '@/components/ui/space';
|
||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
import { Textarea } from '@/components/ui/textarea';
|
import { Textarea } from '@/components/ui/textarea';
|
||||||
import { useFetchChunk } from '@/hooks/chunk-hooks';
|
import { useFetchChunk } from '@/hooks/use-chunk-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { Trash2 } from 'lucide-react';
|
import { Trash2 } from 'lucide-react';
|
||||||
import React, { useCallback, useEffect, useState } from 'react';
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
|
|||||||
@ -8,8 +8,10 @@ import {
|
|||||||
FormMessage,
|
FormMessage,
|
||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { NumberInput } from '@/components/ui/input';
|
import { NumberInput } from '@/components/ui/input';
|
||||||
import { useFetchTagListByKnowledgeIds } from '@/hooks/knowledge-hooks';
|
import {
|
||||||
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
|
useFetchKnowledgeBaseConfiguration,
|
||||||
|
useFetchTagListByKnowledgeIds,
|
||||||
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { CircleMinus, Plus } from 'lucide-react';
|
import { CircleMinus, Plus } from 'lucide-react';
|
||||||
import { useCallback, useEffect, useMemo } from 'react';
|
import { useCallback, useEffect, useMemo } from 'react';
|
||||||
import { useFieldArray, useFormContext } from 'react-hook-form';
|
import { useFieldArray, useFormContext } from 'react-hook-form';
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
import { ReactComponent as FilterIcon } from '@/assets/filter.svg';
|
import { ReactComponent as FilterIcon } from '@/assets/filter.svg';
|
||||||
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
||||||
import { IChunkListResult, useSelectChunkList } from '@/hooks/chunk-hooks';
|
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useKnowledgeBaseId } from '@/hooks/knowledge-hooks';
|
import {
|
||||||
|
IChunkListResult,
|
||||||
|
useSelectChunkList,
|
||||||
|
} from '@/hooks/use-chunk-request';
|
||||||
|
import { useKnowledgeBaseId } from '@/hooks/use-knowledge-request';
|
||||||
import {
|
import {
|
||||||
ArrowLeftOutlined,
|
ArrowLeftOutlined,
|
||||||
CheckCircleOutlined,
|
CheckCircleOutlined,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { TimelineNode } from '@/components/originui/timeline';
|
import { TimelineNode } from '@/components/originui/timeline';
|
||||||
import message from '@/components/ui/message';
|
import message from '@/components/ui/message';
|
||||||
import { useCreateChunk, useDeleteChunk } from '@/hooks/chunk-hooks';
|
|
||||||
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
|
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
|
||||||
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook';
|
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook';
|
||||||
import { useFetchMessageTrace } from '@/hooks/use-agent-request';
|
import { useFetchMessageTrace } from '@/hooks/use-agent-request';
|
||||||
|
import { useCreateChunk, useDeleteChunk } from '@/hooks/use-chunk-request';
|
||||||
import kbService from '@/services/knowledge-service';
|
import kbService from '@/services/knowledge-service';
|
||||||
import { formatSecondsToHumanReadable } from '@/utils/date';
|
import { formatSecondsToHumanReadable } from '@/utils/date';
|
||||||
import { buildChunkHighlights } from '@/utils/document-util';
|
import { buildChunkHighlights } from '@/utils/document-util';
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import SvgIcon from '@/components/svg-icon';
|
import SvgIcon from '@/components/svg-icon';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useSelectParserList } from '@/hooks/user-setting-hooks';
|
import { useSelectParserList } from '@/hooks/use-user-setting-request';
|
||||||
import { Col, Divider, Empty, Row, Typography } from 'antd';
|
import { Col, Divider, Empty, Row, Typography } from 'antd';
|
||||||
import DOMPurify from 'dompurify';
|
import DOMPurify from 'dompurify';
|
||||||
import camelCase from 'lodash/camelCase';
|
import camelCase from 'lodash/camelCase';
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import {
|
|||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { MultiSelect } from '@/components/ui/multi-select';
|
import { MultiSelect } from '@/components/ui/multi-select';
|
||||||
import { FormLayout } from '@/constants/form';
|
import { FormLayout } from '@/constants/form';
|
||||||
import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeList } from '@/hooks/use-knowledge-request';
|
||||||
import { Form, Select, Space } from 'antd';
|
import { Form, Select, Space } from 'antd';
|
||||||
import DOMPurify from 'dompurify';
|
import DOMPurify from 'dompurify';
|
||||||
import { useFormContext, useWatch } from 'react-hook-form';
|
import { useFormContext, useWatch } from 'react-hook-form';
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { LlmModelType } from '@/constants/knowledge';
|
import { LlmModelType } from '@/constants/knowledge';
|
||||||
import { useSetModalState } from '@/hooks/common-hooks';
|
import { useSetModalState } from '@/hooks/common-hooks';
|
||||||
|
|
||||||
import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks';
|
|
||||||
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
|
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
|
||||||
import { useSelectParserList } from '@/hooks/user-setting-hooks';
|
import { useSelectLlmOptionsByModelType } from '@/hooks/use-llm-request';
|
||||||
|
import { useSelectParserList } from '@/hooks/use-user-setting-request';
|
||||||
import kbService from '@/services/knowledge-service';
|
import kbService from '@/services/knowledge-service';
|
||||||
import { useIsFetching } from '@tanstack/react-query';
|
import { useIsFetching } from '@tanstack/react-query';
|
||||||
import { pick } from 'lodash';
|
import { pick } from 'lodash';
|
||||||
|
|||||||
@ -33,7 +33,7 @@ import {
|
|||||||
TooltipProvider,
|
TooltipProvider,
|
||||||
TooltipTrigger,
|
TooltipTrigger,
|
||||||
} from '@/components/ui/tooltip';
|
} from '@/components/ui/tooltip';
|
||||||
import { useDeleteTag, useFetchTagList } from '@/hooks/knowledge-hooks';
|
import { useDeleteTag, useFetchTagList } from '@/hooks/use-knowledge-request';
|
||||||
import { useCallback, useEffect, useState } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useRenameKnowledgeTag } from '../hooks';
|
import { useRenameKnowledgeTag } from '../hooks';
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
} from '@/components/ui/dialog';
|
} from '@/components/ui/dialog';
|
||||||
import { LoadingButton } from '@/components/ui/loading-button';
|
import { LoadingButton } from '@/components/ui/loading-button';
|
||||||
import { TagRenameId } from '@/constants/knowledge';
|
import { TagRenameId } from '@/constants/knowledge';
|
||||||
import { useTagIsRenaming } from '@/hooks/knowledge-hooks';
|
import { useTagIsRenaming } from '@/hooks/use-knowledge-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { RenameForm } from './rename-form';
|
import { RenameForm } from './rename-form';
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import {
|
|||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { Input } from '@/components/ui/input';
|
import { Input } from '@/components/ui/input';
|
||||||
import { TagRenameId } from '@/constants/knowledge';
|
import { TagRenameId } from '@/constants/knowledge';
|
||||||
import { useRenameTag } from '@/hooks/knowledge-hooks';
|
import { useRenameTag } from '@/hooks/use-knowledge-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useFetchTagList } from '@/hooks/knowledge-hooks';
|
import { useFetchTagList } from '@/hooks/use-knowledge-request';
|
||||||
import { Chart } from '@antv/g2';
|
import { Chart } from '@antv/g2';
|
||||||
import { sumBy } from 'lodash';
|
import { sumBy } from 'lodash';
|
||||||
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
||||||
|
|||||||
@ -1,69 +1,11 @@
|
|||||||
import { useSetModalState } from '@/hooks/common-hooks';
|
import { useSetModalState } from '@/hooks/common-hooks';
|
||||||
import { useNextWebCrawl } from '@/hooks/document-hooks';
|
|
||||||
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook';
|
|
||||||
import { IDocumentInfo } from '@/interfaces/database/document';
|
import { IDocumentInfo } from '@/interfaces/database/document';
|
||||||
import { formatDate, formatSecondsToHumanReadable } from '@/utils/date';
|
import { formatDate, formatSecondsToHumanReadable } from '@/utils/date';
|
||||||
import { formatBytes } from '@/utils/file-util';
|
import { formatBytes } from '@/utils/file-util';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
import { useNavigate } from 'umi';
|
|
||||||
import { ILogInfo } from '../process-log-modal';
|
import { ILogInfo } from '../process-log-modal';
|
||||||
import { RunningStatus } from './constant';
|
import { RunningStatus } from './constant';
|
||||||
|
|
||||||
export const useNavigateToOtherPage = () => {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const { knowledgeId } = useGetKnowledgeSearchParams();
|
|
||||||
|
|
||||||
const linkToUploadPage = useCallback(() => {
|
|
||||||
navigate(`/knowledge/dataset/upload?id=${knowledgeId}`);
|
|
||||||
}, [navigate, knowledgeId]);
|
|
||||||
|
|
||||||
const toChunk = useCallback((id: string) => {}, []);
|
|
||||||
|
|
||||||
return { linkToUploadPage, toChunk };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useGetRowSelection = () => {
|
|
||||||
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
|
|
||||||
|
|
||||||
const rowSelection = {
|
|
||||||
selectedRowKeys,
|
|
||||||
onChange: (newSelectedRowKeys: React.Key[]) => {
|
|
||||||
setSelectedRowKeys(newSelectedRowKeys);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return rowSelection;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useHandleWebCrawl = () => {
|
|
||||||
const {
|
|
||||||
visible: webCrawlUploadVisible,
|
|
||||||
hideModal: hideWebCrawlUploadModal,
|
|
||||||
showModal: showWebCrawlUploadModal,
|
|
||||||
} = useSetModalState();
|
|
||||||
const { webCrawl, loading } = useNextWebCrawl();
|
|
||||||
|
|
||||||
const onWebCrawlUploadOk = useCallback(
|
|
||||||
async (name: string, url: string) => {
|
|
||||||
const ret = await webCrawl({ name, url });
|
|
||||||
if (ret === 0) {
|
|
||||||
hideWebCrawlUploadModal();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
},
|
|
||||||
[webCrawl, hideWebCrawlUploadModal],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
webCrawlUploadLoading: loading,
|
|
||||||
onWebCrawlUploadOk,
|
|
||||||
webCrawlUploadVisible,
|
|
||||||
hideWebCrawlUploadModal,
|
|
||||||
showWebCrawlUploadModal,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useShowLog = (documents: IDocumentInfo[]) => {
|
export const useShowLog = (documents: IDocumentInfo[]) => {
|
||||||
const { showModal, hideModal, visible } = useSetModalState();
|
const { showModal, hideModal, visible } = useSetModalState();
|
||||||
const [record, setRecord] = useState<IDocumentInfo>();
|
const [record, setRecord] = useState<IDocumentInfo>();
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useFetchTenantInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchTenantInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
export function useDisplayOwnerName() {
|
export function useDisplayOwnerName() {
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import {
|
|||||||
import { FileIcon } from '@/components/icon-font';
|
import { FileIcon } from '@/components/icon-font';
|
||||||
import NewDocumentLink from '@/components/new-document-link';
|
import NewDocumentLink from '@/components/new-document-link';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { useDownloadFile } from '@/hooks/file-manager-hooks';
|
import { useDownloadFile } from '@/hooks/use-file-request';
|
||||||
import { IFile } from '@/interfaces/database/file-manager';
|
import { IFile } from '@/interfaces/database/file-manager';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@ -1,8 +1,5 @@
|
|||||||
import { useSetModalState } from '@/hooks/common-hooks';
|
import { useSetModalState } from '@/hooks/common-hooks';
|
||||||
import {
|
import { useConnectToKnowledge, useRenameFile } from '@/hooks/use-file-request';
|
||||||
useConnectToKnowledge,
|
|
||||||
useRenameFile,
|
|
||||||
} from '@/hooks/file-manager-hooks';
|
|
||||||
import { IFile } from '@/interfaces/database/file-manager';
|
import { IFile } from '@/interfaces/database/file-manager';
|
||||||
import { TableRowSelection } from 'antd/es/table/interface';
|
import { TableRowSelection } from 'antd/es/table/interface';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import {
|
|||||||
FormMessage,
|
FormMessage,
|
||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { MultiSelect } from '@/components/ui/multi-select';
|
import { MultiSelect } from '@/components/ui/multi-select';
|
||||||
import { useSelectKnowledgeOptions } from '@/hooks/knowledge-hooks';
|
import { useSelectKnowledgeOptions } from '@/hooks/use-knowledge-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import { Link2 } from 'lucide-react';
|
import { Link2 } from 'lucide-react';
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import {
|
|||||||
DialogHeader,
|
DialogHeader,
|
||||||
DialogTitle,
|
DialogTitle,
|
||||||
} from '@/components/ui/dialog';
|
} from '@/components/ui/dialog';
|
||||||
import { useFetchPureFileList } from '@/hooks/file-manager-hooks';
|
import { useFetchPureFileList } from '@/hooks/use-file-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { IFile } from '@/interfaces/database/file-manager';
|
import { IFile } from '@/interfaces/database/file-manager';
|
||||||
import { isEmpty } from 'lodash';
|
import { isEmpty } from 'lodash';
|
||||||
|
|||||||
@ -5,8 +5,8 @@ import {
|
|||||||
useLoginChannels,
|
useLoginChannels,
|
||||||
useLoginWithChannel,
|
useLoginWithChannel,
|
||||||
useRegister,
|
useRegister,
|
||||||
} from '@/hooks/login-hooks';
|
} from '@/hooks/use-login-request';
|
||||||
import { useSystemConfig } from '@/hooks/system-hooks';
|
import { useSystemConfig } from '@/hooks/use-system-request';
|
||||||
import { rsaPsw } from '@/utils';
|
import { rsaPsw } from '@/utils';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -20,7 +20,7 @@ import {
|
|||||||
useGetChatSearchParams,
|
useGetChatSearchParams,
|
||||||
useSetDialog,
|
useSetDialog,
|
||||||
} from '@/hooks/use-chat-request';
|
} from '@/hooks/use-chat-request';
|
||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { buildMessageUuidWithRole } from '@/utils/chat';
|
import { buildMessageUuidWithRole } from '@/utils/chat';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import { t } from 'i18next';
|
import { t } from 'i18next';
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import {
|
|||||||
useFetchDialog,
|
useFetchDialog,
|
||||||
useGetChatSearchParams,
|
useGetChatSearchParams,
|
||||||
} from '@/hooks/use-chat-request';
|
} from '@/hooks/use-chat-request';
|
||||||
import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { buildMessageUuidWithRole } from '@/utils/chat';
|
import { buildMessageUuidWithRole } from '@/utils/chat';
|
||||||
import {
|
import {
|
||||||
useGetSendButtonDisabled,
|
useGetSendButtonDisabled,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import PdfSheet from '@/components/pdf-drawer';
|
|||||||
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
|
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
|
||||||
import { useSyncThemeFromParams } from '@/components/theme-provider';
|
import { useSyncThemeFromParams } from '@/components/theme-provider';
|
||||||
import { MessageType, SharedFrom } from '@/constants/chat';
|
import { MessageType, SharedFrom } from '@/constants/chat';
|
||||||
import { useFetchFlowSSE } from '@/hooks/flow-hooks';
|
import { useFetchFlowSSE } from '@/hooks/use-agent-request';
|
||||||
import {
|
import {
|
||||||
useFetchExternalChatInfo,
|
useFetchExternalChatInfo,
|
||||||
useFetchNextConversationSSE,
|
useFetchNextConversationSSE,
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { Modal } from '@/components/ui/modal/modal';
|
|||||||
import {
|
import {
|
||||||
useGetChunkHighlights,
|
useGetChunkHighlights,
|
||||||
useGetDocumentUrl,
|
useGetDocumentUrl,
|
||||||
} from '@/hooks/document-hooks';
|
} from '@/hooks/use-document-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { IReferenceChunk } from '@/interfaces/database/chat';
|
import { IReferenceChunk } from '@/interfaces/database/chat';
|
||||||
import { IChunk } from '@/interfaces/database/knowledge';
|
import { IChunk } from '@/interfaces/database/knowledge';
|
||||||
|
|||||||
@ -1,13 +1,15 @@
|
|||||||
import message from '@/components/ui/message';
|
import message from '@/components/ui/message';
|
||||||
import { SharedFrom } from '@/constants/chat';
|
import { SharedFrom } from '@/constants/chat';
|
||||||
import { useSetModalState } from '@/hooks/common-hooks';
|
import { useSetModalState } from '@/hooks/common-hooks';
|
||||||
import { useSelectTestingResult } from '@/hooks/knowledge-hooks';
|
|
||||||
import {
|
import {
|
||||||
useGetPaginationWithRouter,
|
useGetPaginationWithRouter,
|
||||||
useSendMessageWithSse,
|
useSendMessageWithSse,
|
||||||
} from '@/hooks/logic-hooks';
|
} from '@/hooks/logic-hooks';
|
||||||
import { useSetPaginationParams } from '@/hooks/route-hook';
|
import { useSetPaginationParams } from '@/hooks/route-hook';
|
||||||
import { useKnowledgeBaseId } from '@/hooks/use-knowledge-request';
|
import {
|
||||||
|
useKnowledgeBaseId,
|
||||||
|
useSelectTestingResult,
|
||||||
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { ResponsePostType } from '@/interfaces/database/base';
|
import { ResponsePostType } from '@/interfaces/database/base';
|
||||||
import { IAnswer } from '@/interfaces/database/chat';
|
import { IAnswer } from '@/interfaces/database/chat';
|
||||||
import { ITestingResult } from '@/interfaces/database/knowledge';
|
import { ITestingResult } from '@/interfaces/database/knowledge';
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
|
|||||||
import {
|
import {
|
||||||
useFetchTenantInfo,
|
useFetchTenantInfo,
|
||||||
useFetchUserInfo,
|
useFetchUserInfo,
|
||||||
} from '@/hooks/user-setting-hooks';
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { Send, Settings } from 'lucide-react';
|
import { Send, Settings } from 'lucide-react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import remarkGfm from 'remark-gfm';
|
|||||||
import remarkMath from 'remark-math';
|
import remarkMath from 'remark-math';
|
||||||
import { visitParents } from 'unist-util-visit-parents';
|
import { visitParents } from 'unist-util-visit-parents';
|
||||||
|
|
||||||
import { useFetchDocumentThumbnailsByIds } from '@/hooks/document-hooks';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you
|
||||||
@ -33,6 +32,7 @@ import {
|
|||||||
PopoverContent,
|
PopoverContent,
|
||||||
PopoverTrigger,
|
PopoverTrigger,
|
||||||
} from '@/components/ui/popover';
|
} from '@/components/ui/popover';
|
||||||
|
import { useFetchDocumentThumbnailsByIds } from '@/hooks/use-document-request';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { omit } from 'lodash';
|
import { omit } from 'lodash';
|
||||||
import { pipe } from 'lodash/fp';
|
import { pipe } from 'lodash/fp';
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import {
|
|||||||
useAllTestingResult,
|
useAllTestingResult,
|
||||||
useChunkIsTesting,
|
useChunkIsTesting,
|
||||||
useSelectTestingResult,
|
useSelectTestingResult,
|
||||||
} from '@/hooks/knowledge-hooks';
|
} from '@/hooks/use-knowledge-request';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { CheckIcon, ChevronDown, Files, XIcon } from 'lucide-react';
|
import { CheckIcon, ChevronDown, Files, XIcon } from 'lucide-react';
|
||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
|
|||||||
@ -29,12 +29,12 @@ import { RAGFlowSelect } from '@/components/ui/select';
|
|||||||
import { Spin } from '@/components/ui/spin';
|
import { Spin } from '@/components/ui/spin';
|
||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
import { Textarea } from '@/components/ui/textarea';
|
import { Textarea } from '@/components/ui/textarea';
|
||||||
import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
|
import { useFetchKnowledgeList } from '@/hooks/use-knowledge-request';
|
||||||
import {
|
import {
|
||||||
useComposeLlmOptionsByModelTypes,
|
useComposeLlmOptionsByModelTypes,
|
||||||
useSelectLlmOptionsByModelType,
|
useSelectLlmOptionsByModelType,
|
||||||
} from '@/hooks/llm-hooks';
|
} from '@/hooks/use-llm-request';
|
||||||
import { useFetchTenantInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchTenantInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { IKnowledge } from '@/interfaces/database/knowledge';
|
import { IKnowledge } from '@/interfaces/database/knowledge';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useLogout } from '@/hooks/login-hooks';
|
import { useLogout } from '@/hooks/use-login-request';
|
||||||
import { Routes } from '@/routes';
|
import { Routes } from '@/routes';
|
||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { useNavigate } from 'umi';
|
import { useNavigate } from 'umi';
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
|
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
|
||||||
import ThemeToggle from '@/components/theme-toggle';
|
import ThemeToggle from '@/components/theme-toggle';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { useLogout } from '@/hooks/login-hooks';
|
|
||||||
import { useSecondPathName } from '@/hooks/route-hook';
|
import { useSecondPathName } from '@/hooks/route-hook';
|
||||||
|
import { useLogout } from '@/hooks/use-login-request';
|
||||||
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { Routes } from '@/routes';
|
import { Routes } from '@/routes';
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import { LlmIcon } from '@/components/svg-icon';
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
|
import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
|
||||||
import { LlmItem } from '@/hooks/llm-hooks';
|
import { LlmItem } from '@/hooks/use-llm-request';
|
||||||
import { getRealModelName } from '@/utils/llm-util';
|
import { getRealModelName } from '@/utils/llm-util';
|
||||||
import { EditOutlined, SettingOutlined } from '@ant-design/icons';
|
import { EditOutlined, SettingOutlined } from '@ant-design/icons';
|
||||||
import { ChevronsDown, ChevronsUp, Trash2 } from 'lucide-react';
|
import { ChevronsDown, ChevronsUp, Trash2 } from 'lucide-react';
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { useTranslate } from '@/hooks/common-hooks';
|
|||||||
import {
|
import {
|
||||||
ISystemModelSettingSavingParams,
|
ISystemModelSettingSavingParams,
|
||||||
useComposeLlmOptionsByModelTypes,
|
useComposeLlmOptionsByModelTypes,
|
||||||
} from '@/hooks/llm-hooks';
|
} from '@/hooks/use-llm-request';
|
||||||
import { CircleQuestionMark } from 'lucide-react';
|
import { CircleQuestionMark } from 'lucide-react';
|
||||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import { useFetchSystemModelSettingOnMount } from '../hooks';
|
import { useFetchSystemModelSettingOnMount } from '../hooks';
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { LlmIcon } from '@/components/svg-icon';
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { SearchInput } from '@/components/ui/input';
|
import { SearchInput } from '@/components/ui/input';
|
||||||
import { useTranslate } from '@/hooks/common-hooks';
|
import { useTranslate } from '@/hooks/common-hooks';
|
||||||
import { useSelectLlmList } from '@/hooks/llm-hooks';
|
import { useSelectLlmList } from '@/hooks/use-llm-request';
|
||||||
import { Plus } from 'lucide-react';
|
import { Plus } from 'lucide-react';
|
||||||
import { FC, useMemo, useState } from 'react';
|
import { FC, useMemo, useState } from 'react';
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { LlmItem, useSelectLlmList } from '@/hooks/llm-hooks';
|
import { LlmItem, useSelectLlmList } from '@/hooks/use-llm-request';
|
||||||
import { t } from 'i18next';
|
import { t } from 'i18next';
|
||||||
import { ModelProviderCard } from './modal-card';
|
import { ModelProviderCard } from './modal-card';
|
||||||
|
|
||||||
|
|||||||
@ -9,8 +9,8 @@ import {
|
|||||||
useSaveApiKey,
|
useSaveApiKey,
|
||||||
useSaveTenantInfo,
|
useSaveTenantInfo,
|
||||||
useSelectLlmOptionsByModelType,
|
useSelectLlmOptionsByModelType,
|
||||||
} from '@/hooks/llm-hooks';
|
} from '@/hooks/use-llm-request';
|
||||||
import { useFetchTenantInfo } from '@/hooks/user-setting-hooks';
|
import { useFetchTenantInfo } from '@/hooks/use-user-setting-request';
|
||||||
import { IAddLlmRequestBody } from '@/interfaces/request/llm';
|
import { IAddLlmRequestBody } from '@/interfaces/request/llm';
|
||||||
import { getRealModelName } from '@/utils/llm-util';
|
import { getRealModelName } from '@/utils/llm-util';
|
||||||
import { useQueryClient } from '@tanstack/react-query';
|
import { useQueryClient } from '@tanstack/react-query';
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import Spotlight from '@/components/spotlight';
|
import Spotlight from '@/components/spotlight';
|
||||||
import { LLMFactory } from '@/constants/llm';
|
import { LLMFactory } from '@/constants/llm';
|
||||||
import { LlmItem, useFetchMyLlmListDetailed } from '@/hooks/llm-hooks';
|
import { LlmItem, useFetchMyLlmListDetailed } from '@/hooks/use-llm-request';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import { isLocalLlmFactory } from '../utils';
|
import { isLocalLlmFactory } from '../utils';
|
||||||
import SystemSetting from './components/system-setting';
|
import SystemSetting from './components/system-setting';
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import {
|
|||||||
CardHeader,
|
CardHeader,
|
||||||
CardTitle,
|
CardTitle,
|
||||||
} from '@/components/ui/card';
|
} from '@/components/ui/card';
|
||||||
import { useFetchLangfuseConfig } from '@/hooks/user-setting-hooks';
|
import { useFetchLangfuseConfig } from '@/hooks/use-user-setting-request';
|
||||||
import { Eye, Settings2 } from 'lucide-react';
|
import { Eye, Settings2 } from 'lucide-react';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import {
|
|||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
} from '@/components/ui/dialog';
|
} from '@/components/ui/dialog';
|
||||||
import { LoadingButton } from '@/components/ui/loading-button';
|
import { LoadingButton } from '@/components/ui/loading-button';
|
||||||
import { useDeleteLangfuseConfig } from '@/hooks/user-setting-hooks';
|
import { useDeleteLangfuseConfig } from '@/hooks/use-user-setting-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { ExternalLink, Trash2 } from 'lucide-react';
|
import { ExternalLink, Trash2 } from 'lucide-react';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import {
|
|||||||
FormMessage,
|
FormMessage,
|
||||||
} from '@/components/ui/form';
|
} from '@/components/ui/form';
|
||||||
import { Input } from '@/components/ui/input';
|
import { Input } from '@/components/ui/input';
|
||||||
import { useFetchLangfuseConfig } from '@/hooks/user-setting-hooks';
|
import { useFetchLangfuseConfig } from '@/hooks/use-user-setting-request';
|
||||||
import { IModalProps } from '@/interfaces/common';
|
import { IModalProps } from '@/interfaces/common';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { useSetModalState } from '@/hooks/common-hooks';
|
import { useSetModalState } from '@/hooks/common-hooks';
|
||||||
import { useSetLangfuseConfig } from '@/hooks/user-setting-hooks';
|
import { useSetLangfuseConfig } from '@/hooks/use-user-setting-request';
|
||||||
import { ISetLangfuseConfigRequestBody } from '@/interfaces/request/system';
|
import { ISetLangfuseConfigRequestBody } from '@/interfaces/request/system';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { useTranslate } from '@/hooks/common-hooks';
|
|||||||
import {
|
import {
|
||||||
ISystemModelSettingSavingParams,
|
ISystemModelSettingSavingParams,
|
||||||
useComposeLlmOptionsByModelTypes,
|
useComposeLlmOptionsByModelTypes,
|
||||||
} from '@/hooks/llm-hooks';
|
} from '@/hooks/use-llm-request';
|
||||||
import { Form, Modal, Select } from 'antd';
|
import { Form, Modal, Select } from 'antd';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useFetchSystemModelSettingOnMount } from '../../hooks';
|
import { useFetchSystemModelSettingOnMount } from '../../hooks';
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import {
|
|||||||
useAgreeTenant,
|
useAgreeTenant,
|
||||||
useDeleteTenantUser,
|
useDeleteTenantUser,
|
||||||
useFetchUserInfo,
|
useFetchUserInfo,
|
||||||
} from '@/hooks/user-setting-hooks';
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|||||||
import {
|
import {
|
||||||
useFetchUserInfo,
|
useFetchUserInfo,
|
||||||
useListTenantUser,
|
useListTenantUser,
|
||||||
} from '@/hooks/user-setting-hooks';
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import Spotlight from '@/components/spotlight';
|
import Spotlight from '@/components/spotlight';
|
||||||
|
|||||||
@ -8,7 +8,10 @@ import {
|
|||||||
TableHeader,
|
TableHeader,
|
||||||
TableRow,
|
TableRow,
|
||||||
} from '@/components/ui/table';
|
} from '@/components/ui/table';
|
||||||
import { useFetchUserInfo, useListTenant } from '@/hooks/user-setting-hooks';
|
import {
|
||||||
|
useFetchUserInfo,
|
||||||
|
useListTenant,
|
||||||
|
} from '@/hooks/use-user-setting-request';
|
||||||
import { formatDate } from '@/utils/date';
|
import { formatDate } from '@/utils/date';
|
||||||
import { ArrowDown, ArrowUp, ArrowUpDown, LogOut } from 'lucide-react';
|
import { ArrowDown, ArrowUp, ArrowUpDown, LogOut } from 'lucide-react';
|
||||||
import { useMemo, useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import {
|
|||||||
TableHeader,
|
TableHeader,
|
||||||
TableRow,
|
TableRow,
|
||||||
} from '@/components/ui/table';
|
} from '@/components/ui/table';
|
||||||
import { useListTenantUser } from '@/hooks/user-setting-hooks';
|
import { useListTenantUser } from '@/hooks/use-user-setting-request';
|
||||||
import { formatDate } from '@/utils/date';
|
import { formatDate } from '@/utils/date';
|
||||||
import { upperFirst } from 'lodash';
|
import { upperFirst } from 'lodash';
|
||||||
import { ArrowDown, ArrowUp, ArrowUpDown, Trash2 } from 'lucide-react';
|
import { ArrowDown, ArrowUp, ArrowUpDown, Trash2 } from 'lucide-react';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useLogout } from '@/hooks/login-hooks';
|
import { useLogout } from '@/hooks/use-login-request';
|
||||||
import { Routes } from '@/routes';
|
import { Routes } from '@/routes';
|
||||||
import { useCallback, useEffect, useState } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useLocation, useNavigate } from 'umi';
|
import { useLocation, useNavigate } from 'umi';
|
||||||
|
|||||||
@ -3,8 +3,8 @@ import { RAGFlowAvatar } from '@/components/ragflow-avatar';
|
|||||||
import ThemeToggle from '@/components/theme-toggle';
|
import ThemeToggle from '@/components/theme-toggle';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Domain } from '@/constants/common';
|
import { Domain } from '@/constants/common';
|
||||||
import { useLogout } from '@/hooks/login-hooks';
|
|
||||||
import { useSecondPathName } from '@/hooks/route-hook';
|
import { useSecondPathName } from '@/hooks/route-hook';
|
||||||
|
import { useLogout } from '@/hooks/use-login-request';
|
||||||
import {
|
import {
|
||||||
useFetchSystemVersion,
|
useFetchSystemVersion,
|
||||||
useFetchUserInfo,
|
useFetchUserInfo,
|
||||||
|
|||||||
@ -1,103 +0,0 @@
|
|||||||
import api from '@/utils/api';
|
|
||||||
import registerServer from '@/utils/register-server';
|
|
||||||
import request from '@/utils/request';
|
|
||||||
|
|
||||||
const {
|
|
||||||
getCanvas,
|
|
||||||
getCanvasSSE,
|
|
||||||
setCanvas,
|
|
||||||
getListVersion,
|
|
||||||
getVersion,
|
|
||||||
listCanvas,
|
|
||||||
resetCanvas,
|
|
||||||
removeCanvas,
|
|
||||||
runCanvas,
|
|
||||||
listTemplates,
|
|
||||||
testDbConnect,
|
|
||||||
getInputElements,
|
|
||||||
debug,
|
|
||||||
listCanvasTeam,
|
|
||||||
settingCanvas,
|
|
||||||
uploadCanvasFile,
|
|
||||||
trace,
|
|
||||||
inputForm,
|
|
||||||
} = api;
|
|
||||||
|
|
||||||
const methods = {
|
|
||||||
getCanvas: {
|
|
||||||
url: getCanvas,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
getCanvasSSE: {
|
|
||||||
url: getCanvasSSE,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
setCanvas: {
|
|
||||||
url: setCanvas,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
getListVersion: {
|
|
||||||
url: getListVersion,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
getVersion: {
|
|
||||||
url: getVersion,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
listCanvas: {
|
|
||||||
url: listCanvas,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
resetCanvas: {
|
|
||||||
url: resetCanvas,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
removeCanvas: {
|
|
||||||
url: removeCanvas,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
runCanvas: {
|
|
||||||
url: runCanvas,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
listTemplates: {
|
|
||||||
url: listTemplates,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
testDbConnect: {
|
|
||||||
url: testDbConnect,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
getInputElements: {
|
|
||||||
url: getInputElements,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
debugSingle: {
|
|
||||||
url: debug,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
listCanvasTeam: {
|
|
||||||
url: listCanvasTeam,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
settingCanvas: {
|
|
||||||
url: settingCanvas,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
uploadCanvasFile: {
|
|
||||||
url: uploadCanvasFile,
|
|
||||||
method: 'post',
|
|
||||||
},
|
|
||||||
trace: {
|
|
||||||
url: trace,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
inputForm: {
|
|
||||||
url: inputForm,
|
|
||||||
method: 'get',
|
|
||||||
},
|
|
||||||
} as const;
|
|
||||||
|
|
||||||
const flowService = registerServer<keyof typeof methods>(methods, request);
|
|
||||||
|
|
||||||
export default flowService;
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user