84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
import type {
|
|
ParseCreationAgentDocumentInputRequest,
|
|
ParseCreationAgentDocumentInputResponse,
|
|
} from '../../../packages/shared/src/contracts/creationAgentDocumentInput';
|
|
import { requestJson } from '../apiClient';
|
|
|
|
const DOCUMENT_INPUT_PARSE_ENDPOINT =
|
|
'/api/runtime/creation-agent/document-inputs/parse';
|
|
const MAX_DOCUMENT_INPUT_BYTES = 256 * 1024;
|
|
const SUPPORTED_DOCUMENT_INPUT_EXTENSIONS = new Set([
|
|
'txt',
|
|
'md',
|
|
'markdown',
|
|
'docx',
|
|
'csv',
|
|
'json',
|
|
]);
|
|
|
|
export async function parseCreationAgentDocumentInput(
|
|
file: File,
|
|
): Promise<ParseCreationAgentDocumentInputResponse> {
|
|
validateCreationAgentDocumentInputFile(file);
|
|
|
|
const contentBase64 = await readFileAsBase64(file);
|
|
const payload: ParseCreationAgentDocumentInputRequest = {
|
|
fileName: file.name,
|
|
contentType: file.type || null,
|
|
contentBase64,
|
|
};
|
|
|
|
return requestJson<ParseCreationAgentDocumentInputResponse>(
|
|
DOCUMENT_INPUT_PARSE_ENDPOINT,
|
|
{
|
|
method: 'POST',
|
|
headers: {
|
|
'content-type': 'application/json',
|
|
},
|
|
body: JSON.stringify(payload),
|
|
},
|
|
'解析文档失败',
|
|
{
|
|
retry: {
|
|
maxRetries: 0,
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function validateCreationAgentDocumentInputFile(file: File) {
|
|
const fileName = file.name.trim();
|
|
const extension = fileName.includes('.')
|
|
? fileName.split('.').pop()?.trim().toLowerCase()
|
|
: '';
|
|
|
|
if (!extension || !SUPPORTED_DOCUMENT_INPUT_EXTENSIONS.has(extension)) {
|
|
throw new Error('暂时只支持 txt、md、docx、csv、json 文档。');
|
|
}
|
|
|
|
if (file.size <= 0) {
|
|
throw new Error('文档内容为空,请选择有内容的文件。');
|
|
}
|
|
|
|
if (file.size > MAX_DOCUMENT_INPUT_BYTES) {
|
|
throw new Error('文档过大,请上传 256KB 以内的文本文件。');
|
|
}
|
|
}
|
|
|
|
function readFileAsBase64(file: File): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
const reader = new FileReader();
|
|
|
|
reader.onerror = () => {
|
|
reject(new Error('读取文档失败,请重新选择文件。'));
|
|
};
|
|
reader.onload = () => {
|
|
const result = typeof reader.result === 'string' ? reader.result : '';
|
|
const commaIndex = result.indexOf(',');
|
|
resolve(commaIndex >= 0 ? result.slice(commaIndex + 1) : result);
|
|
};
|
|
|
|
reader.readAsDataURL(file);
|
|
});
|
|
}
|