perf: select file

This commit is contained in:
archer 2023-04-28 09:32:03 +08:00
parent 3b8e5d2738
commit 606105d633
No known key found for this signature in database
GPG Key ID: 166CA6BF2383B2BB
6 changed files with 43 additions and 31 deletions

View File

@ -406,12 +406,12 @@ function getVerbosityLevel() {
} }
function info(msg) { function info(msg) {
if (verbosity >= VerbosityLevel.INFOS) { if (verbosity >= VerbosityLevel.INFOS) {
console.log(`Info: ${msg}`); // console.log(`Info: ${msg}`);
} }
} }
function warn(msg) { function warn(msg) {
if (verbosity >= VerbosityLevel.WARNINGS) { if (verbosity >= VerbosityLevel.WARNINGS) {
console.log(`Warning: ${msg}`); // console.log(`Warning: ${msg}`);
} }
} }
function unreachable(msg) { function unreachable(msg) {
@ -4206,7 +4206,7 @@ function loadScript(src, removeScriptElement = false) {
}); });
} }
function deprecated(details) { function deprecated(details) {
console.log("Deprecated API usage: " + details); // console.log("Deprecated API usage: " + details);
} }
let pdfDateStringRegex; let pdfDateStringRegex;
class PDFDateString { class PDFDateString {

View File

@ -1008,12 +1008,12 @@ function getVerbosityLevel() {
} }
function info(msg) { function info(msg) {
if (verbosity >= VerbosityLevel.INFOS) { if (verbosity >= VerbosityLevel.INFOS) {
console.log(`Info: ${msg}`); // console.log(`Info: ${msg}`);
} }
} }
function warn(msg) { function warn(msg) {
if (verbosity >= VerbosityLevel.WARNINGS) { if (verbosity >= VerbosityLevel.WARNINGS) {
console.log(`Warning: ${msg}`); // console.log(`Warning: ${msg}`);
} }
} }
function unreachable(msg) { function unreachable(msg) {

View File

@ -106,10 +106,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
console.log('api response time:', `${(Date.now() - startTime) / 1000}s`); console.log('api response time:', `${(Date.now() - startTime) / 1000}s`);
step = 1;
let responseContent = ''; let responseContent = '';
if (isStream) { if (isStream) {
step = 1;
const streamResponse = await gpt35StreamResponse({ const streamResponse = await gpt35StreamResponse({
res, res,
stream, stream,

View File

@ -202,10 +202,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
console.log('code response. time:', `${(Date.now() - startTime) / 1000}s`); console.log('code response. time:', `${(Date.now() - startTime) / 1000}s`);
step = 1;
let responseContent = ''; let responseContent = '';
if (isStream) { if (isStream) {
step = 1;
const streamResponse = await gpt35StreamResponse({ const streamResponse = await gpt35StreamResponse({
res, res,
stream, stream,

View File

@ -177,10 +177,10 @@ ${
console.log('api response time:', `${(Date.now() - startTime) / 1000}s`); console.log('api response time:', `${(Date.now() - startTime) / 1000}s`);
step = 1;
let responseContent = ''; let responseContent = '';
if (isStream) { if (isStream) {
step = 1;
const streamResponse = await gpt35StreamResponse({ const streamResponse = await gpt35StreamResponse({
res, res,
stream, stream,

View File

@ -62,36 +62,38 @@ const SelectFileModal = ({
const { openConfirm, ConfirmChild } = useConfirm({ const { openConfirm, ConfirmChild } = useConfirm({
content: `确认导入该文件,需要一定时间进行拆解,该任务无法终止!如果余额不足,未完成的任务会被直接清除。一共 ${ content: `确认导入该文件,需要一定时间进行拆解,该任务无法终止!如果余额不足,未完成的任务会被直接清除。一共 ${
splitRes.chunks.length splitRes.chunks.length
} ${splitRes.tokens} tokens, ${formatPrice( } ${splitRes.tokens || '数量太多,未计算'} tokens, ${formatPrice(
splitRes.tokens * modeMap[mode].price splitRes.tokens * modeMap[mode].price
)} ` )} `
}); });
const fileText = useMemo(() => fileTextArr.join(''), [fileTextArr]);
const onSelectFile = useCallback( const onSelectFile = useCallback(
async (e: File[]) => { async (e: File[]) => {
setSelecting(true); setSelecting(true);
try { try {
const fileTexts = await Promise.all( let promise = Promise.resolve();
e.map((file) => { e.map((file) => {
// @ts-ignore promise = promise.then(async () => {
const extension = file?.name?.split('.').pop().toLowerCase(); const extension = file?.name?.split('.')?.pop()?.toLowerCase();
let text = '';
switch (extension) { switch (extension) {
case 'txt': case 'txt':
case 'md': case 'md':
return readTxtContent(file); text = await readTxtContent(file);
break;
case 'pdf': case 'pdf':
return readPdfContent(file); text = await readPdfContent(file);
break;
case 'doc': case 'doc':
case 'docx': case 'docx':
return readDocContent(file); text = await readDocContent(file);
default: break;
return '';
} }
}) text && setFileTextArr((state) => [text].concat(state));
); return;
setFileTextArr(fileTexts); });
});
await promise;
} catch (error: any) { } catch (error: any) {
console.log(error); console.log(error);
toast({ toast({
@ -131,6 +133,7 @@ const SelectFileModal = ({
const onclickImport = useCallback(() => { const onclickImport = useCallback(() => {
const chunks = fileTextArr const chunks = fileTextArr
.filter((item) => item)
.map((item) => .map((item) =>
splitText({ splitText({
text: item, text: item,
@ -138,10 +141,15 @@ const SelectFileModal = ({
}) })
) )
.flat(); .flat();
// count tokens
const tokens = chunks.map((item) => let tokens: number[] = [];
// just count 100 sets of tokens
if (chunks.length < 100) {
tokens = chunks.map((item) =>
countChatTokens({ messages: [{ role: 'system', content: item }] }) countChatTokens({ messages: [{ role: 'system', content: item }] })
); );
}
setSplitRes({ setSplitRes({
tokens: tokens.reduce((sum, item) => sum + item, 0), tokens: tokens.reduce((sum, item) => sum + item, 0),
@ -169,7 +177,7 @@ const SelectFileModal = ({
> >
<Box mt={2} px={5} maxW={['100%', '70%']} textAlign={'justify'} color={'blackAlpha.600'}> <Box mt={2} px={5} maxW={['100%', '70%']} textAlign={'justify'} color={'blackAlpha.600'}>
{fileExtension} QA {fileExtension} QA
tokens tokens{fileTextArr.length}
</Box> </Box>
{/* 拆分模式 */} {/* 拆分模式 */}
<Flex w={'100%'} px={5} alignItems={'center'} mt={4}> <Flex w={'100%'} px={5} alignItems={'center'} mt={4}>
@ -200,11 +208,11 @@ const SelectFileModal = ({
)} )}
{/* 文本内容 */} {/* 文本内容 */}
<Box flex={'1 0 0'} px={5} h={0} w={'100%'} overflowY={'auto'} mt={4}> <Box flex={'1 0 0'} px={5} h={0} w={'100%'} overflowY={'auto'} mt={4}>
{fileTextArr.map((item, i) => ( {fileTextArr.slice(0, 100).map((item, i) => (
<Box key={i} mb={5}> <Box key={i} mb={5}>
<Box mb={1}>{i + 1}</Box> <Box mb={1}>{i + 1}</Box>
<Textarea <Textarea
placeholder="文件内容" placeholder="文件内容,空内容会自动忽略"
maxLength={-1} maxLength={-1}
rows={10} rows={10}
fontSize={'xs'} fontSize={'xs'}
@ -231,7 +239,11 @@ const SelectFileModal = ({
<Button variant={'outline'} colorScheme={'gray'} mr={3} onClick={onClose}> <Button variant={'outline'} colorScheme={'gray'} mr={3} onClick={onClose}>
</Button> </Button>
<Button isLoading={isLoading} isDisabled={fileText === ''} onClick={onclickImport}> <Button
isLoading={isLoading}
isDisabled={selecting || fileTextArr[0] === ''}
onClick={onclickImport}
>
</Button> </Button>
</Flex> </Flex>