Files
Genarrative/src/services/creation-agent/creationAgentDocumentInput.ts
T
2026-05-08 11:44:42 +08:00

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);
});
}