Fix: Uploading TSV format documents to the knowledge base did not generate any error messages. (#15284)

### What problem does this PR solve?

Fix: Uploading TSV format documents to the knowledge base did not
generate any error messages.

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
balibabu
2026-05-27 14:42:53 +08:00
committed by GitHub
parent 7fb9a26623
commit 2c099bbb95
9 changed files with 32 additions and 108 deletions

View File

@@ -24,7 +24,6 @@ import kbService, {
listDocument,
renameDocument,
uploadDocument,
webCrawlDocument,
} from '@/services/knowledge-service';
import { restAPIv1 } from '@/utils/api';
import { buildChunkHighlights } from '@/utils/document-util';
@@ -56,12 +55,11 @@ export const enum DocumentApiAction {
SetDocumentMeta = 'setDocumentMeta',
FetchDocumentFilter = 'fetchDocumentFilter',
CreateDocument = 'createDocument',
WebCrawl = 'webCrawl',
FetchDocumentThumbnails = 'fetchDocumentThumbnails',
ParseDocument = 'parseDocument',
}
export const useUploadNextDocument = () => {
export const useUploadDocument = () => {
const queryClient = useQueryClient();
const { id } = useParams();
@@ -266,17 +264,17 @@ export const useSetDocumentStatus = () => {
data,
isPending: loading,
mutateAsync,
} = useMutation({
mutationKey: [DocumentApiAction.UpdateDocumentStatus],
mutationFn: async ({
status,
documentId,
datasetId,
}: {
} = useMutation<
any,
Error,
{
status: boolean;
documentId: string | string[];
datasetId: string;
}) => {
}
>({
mutationKey: [DocumentApiAction.UpdateDocumentStatus],
mutationFn: async ({ status, documentId, datasetId }) => {
const ids = Array.isArray(documentId) ? documentId : [documentId];
const { data } = await changeDocumentsStatus({
kb_id: datasetId,
@@ -551,40 +549,6 @@ export const useGetChunkHighlights = (
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 }) => {
if (!knowledgeId) {
return 500;
}
const formData = new FormData();
formData.append('name', name);
formData.append('url', url);
const ret = await webCrawlDocument(knowledgeId, formData);
const code = get(ret, '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>>({

View File

@@ -28,7 +28,6 @@ import {
} from '@/components/ui/table';
import { UseRowSelectionType } from '@/hooks/logic-hooks/use-row-selection';
import { useFetchDocumentList } from '@/hooks/use-document-request';
import { useKnowledgeBaseContext } from '@/pages/dataset/contexts/knowledge-base-context';
import { getExtension } from '@/utils/document-util';
import { t } from 'i18next';
import { pick } from 'lodash';
@@ -89,14 +88,12 @@ export function DatasetTable({
// metaRecord,
// } = useSaveMeta();
const { showLog, logInfo, logVisible, hideLog } = useShowLog(documents);
const { knowledgeBase } = useKnowledgeBaseContext();
const columns = useDatasetTableColumns({
showChangeParserModal,
showRenameModal,
showManageMetadataModal,
showLog,
datasetId: knowledgeBase?.id,
});
const currentPagination = useMemo(() => {

View File

@@ -9,7 +9,6 @@ import {
useSetDocumentStatus,
} from '@/hooks/use-document-request';
import { IDocumentInfo } from '@/interfaces/database/document';
import { useKnowledgeBaseContext } from '@/pages/dataset/contexts/knowledge-base-context';
import {
LucideCircleX,
LucideCylinder,
@@ -20,6 +19,7 @@ import {
} from 'lucide-react';
import { useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router';
import { toast } from 'sonner';
import { DocumentType, RunningStatus } from './constant';
@@ -35,7 +35,7 @@ export function useBulkOperateDataset({
rowSelection,
documents,
);
const { knowledgeBase } = useKnowledgeBaseContext();
const { id } = useParams();
const { runDocumentByIds } = useRunDocument();
const { setDocumentStatus } = useSetDocumentStatus();
@@ -90,10 +90,10 @@ export function useBulkOperateDataset({
setDocumentStatus({
status: enabled,
documentId: selectedRowKeys,
datasetId: knowledgeBase?.id,
datasetId: id!,
});
},
[selectedRowKeys, setDocumentStatus, knowledgeBase],
[selectedRowKeys, setDocumentStatus, id],
);
const handleEnableClick = useCallback(() => {

View File

@@ -15,6 +15,7 @@ import { formatDate } from '@/utils/date';
import { ColumnDef } from '@tanstack/table-core';
import { ArrowUpDown } from 'lucide-react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router';
import { MetadataType } from '../components/metedata/constant';
import { ShowManageMetadataModalProps } from '../components/metedata/interface';
import { DatasetActionCell } from './dataset-action-cell';
@@ -26,7 +27,6 @@ type UseDatasetTableColumnsType = UseChangeDocumentParserShowType &
UseRenameDocumentShowType & {
showLog: (record: IDocumentInfo) => void;
showManageMetadataModal: (config: ShowManageMetadataModalProps) => void;
datasetId?: string;
};
export function useDatasetTableColumns({
@@ -34,7 +34,6 @@ export function useDatasetTableColumns({
showRenameModal,
showManageMetadataModal,
showLog,
datasetId,
}: UseDatasetTableColumnsType) {
const { t } = useTranslation('translation', {
keyPrefix: 'knowledgeDetails',
@@ -42,6 +41,7 @@ export function useDatasetTableColumns({
// const { dataSourceInfo } = useDataSourceInfo();
const { navigateToChunkParsedResult } = useNavigatePage();
const { setDocumentStatus } = useSetDocumentStatus();
const { id: datasetId } = useParams();
const columns: ColumnDef<IDocumentInfo>[] = [
{
@@ -171,7 +171,11 @@ export function useDatasetTableColumns({
<Switch
checked={row.getValue('status') === '1'}
onCheckedChange={(e) => {
setDocumentStatus({ status: e, documentId: id, datasetId });
setDocumentStatus({
status: e,
documentId: id,
datasetId: datasetId!,
});
}}
/>
);

View File

@@ -24,6 +24,7 @@ export const useHandleRunDocumentByIds = (id: string) => {
});
setCurrentId('');
} catch (error) {
console.warn(error);
setCurrentId('');
}
hideModal();

View File

@@ -2,7 +2,7 @@ import { UploadFormSchemaType } from '@/components/file-upload-dialog';
import { useSetModalState } from '@/hooks/common-hooks';
import {
useRunDocument,
useUploadNextDocument,
useUploadDocument,
} from '@/hooks/use-document-request';
import { getUnSupportedFilesCount } from '@/utils/document-util';
import { useCallback } from 'react';
@@ -13,7 +13,7 @@ export const useHandleUploadDocument = () => {
hideModal: hideDocumentUploadModal,
showModal: showDocumentUploadModal,
} = useSetModalState();
const { uploadDocument, loading } = useUploadNextDocument();
const { uploadDocument, loading } = useUploadDocument();
const { runDocumentByIds } = useRunDocument();
const onDocumentUploadOk = useCallback(
@@ -51,7 +51,6 @@ export const useHandleUploadDocument = () => {
runDocumentByIds({
documentIds: ret.data.map((x: any) => x.id),
run: 1,
shouldDelete: false,
});
}

View File

@@ -1,4 +1,3 @@
import { Authorization } from '@/constants/authorization';
import { IRenameTag } from '@/interfaces/database/dataset';
import {
IFetchDocumentListRequestBody,
@@ -6,21 +5,15 @@ import {
} from '@/interfaces/request/knowledge';
import { ProcessingType } from '@/pages/dataset/dataset-overview/dataset-common';
import api from '@/utils/api';
import { getAuthorization } from '@/utils/authorization-util';
import registerServer from '@/utils/register-server';
import request from '@/utils/request';
import axios from 'axios';
const {
createKb,
rmKb,
kbList,
documentChangeStatus,
documentChangeParser,
documentThumbnails,
documentIngest,
documentUpload,
webCrawl,
listTagByKnowledgeIds,
setMeta,
getMeta,
@@ -41,31 +34,14 @@ const methods = {
url: kbList,
method: 'get',
},
// document manager
documentChangeStatus: {
url: documentChangeStatus,
method: 'post',
},
documentIngest: {
url: documentIngest,
method: 'post',
},
documentChangeParser: {
url: documentChangeParser,
method: 'post',
},
documentThumbnails: {
url: documentThumbnails,
method: 'get',
},
documentUpload: {
url: documentUpload,
method: 'post',
},
webCrawl: {
url: webCrawl,
method: 'post',
},
setMeta: {
url: setMeta,
method: 'post',
@@ -74,10 +50,6 @@ const methods = {
url: listTagByKnowledgeIds,
method: 'get',
},
documentFilter: {
url: api.getDatasetFilter,
method: 'get',
},
getMeta: {
url: getMeta,
method: 'get',
@@ -317,14 +289,9 @@ export const listDocument = (
export const documentFilter = (kb_id: string) =>
request.get(api.getDatasetFilter(kb_id), { params: {} });
// Custom upload function that handles dynamic URL using axios directly
export const uploadDocument = async (datasetId: string, formData: FormData) => {
const url = api.documentUpload(datasetId);
const response = await axios.post(url, formData, {
headers: {
[Authorization]: getAuthorization(),
},
});
const response = await request.post(url, { data: formData });
return response.data;
};
@@ -335,18 +302,6 @@ export const createDocument = async (datasetId: string, name: string) => {
return response.data;
};
export const webCrawlDocument = async (
datasetId: string,
formData: FormData,
) => {
const response = await axios.post(api.webCrawl(datasetId), formData, {
headers: {
[Authorization]: getAuthorization(),
},
});
return response.data;
};
export const renameDocument = (
datasetId: string,
documentId: string,

View File

@@ -7,7 +7,7 @@ import authorizationUtil, {
} from '@/utils/authorization-util';
import notification from '@/utils/notification';
import axios from 'axios';
import { convertTheKeysOfTheObjectToSnake } from './common-util';
import { convertTheKeysOfTheObjectToSnake, isFormData } from './common-util';
import { setCachedLlmList } from './llm-cache';
import { addTenantParams } from './llm-util';
@@ -88,7 +88,9 @@ request.interceptors.request.use(
const params = convertTheKeysOfTheObjectToSnake(config.params);
// Add tenant parameters to data
const dataWithTenantParams = addTenantParams(data, config.url);
const dataWithTenantParams = isFormData(data)
? data
: addTenantParams(data, config.url);
const newConfig = { ...config, data: dataWithTenantParams, params };

View File

@@ -12,7 +12,7 @@ import authorizationUtil, {
} from '@/utils/authorization-util';
import notification from '@/utils/notification';
import { RequestMethod, extend } from 'umi-request';
import { convertTheKeysOfTheObjectToSnake } from './common-util';
import { convertTheKeysOfTheObjectToSnake, isFormData } from './common-util';
import { setCachedLlmList } from './llm-cache';
import { addTenantParams } from './llm-util';
@@ -92,7 +92,9 @@ request.interceptors.request.use((url: string, options: any) => {
const params = convertTheKeysOfTheObjectToSnake(options.params);
// Add tenant parameters to data
const dataWithTenantParams = addTenantParams(data, url);
const dataWithTenantParams = isFormData(data)
? data
: addTenantParams(data, url);
return {
url,