diff --git a/src/main/ocr/MacSysOcrProvider.ts b/src/main/ocr/MacSysOcrProvider.ts index aa684c82f..1d9c9c40d 100644 --- a/src/main/ocr/MacSysOcrProvider.ts +++ b/src/main/ocr/MacSysOcrProvider.ts @@ -9,8 +9,8 @@ import { TextItem } from 'pdfjs-dist/types/src/display/api' import BaseOcrProvider from './BaseOcrProvider' export default class MacSysOcrProvider extends BaseOcrProvider { - private readonly BATCH_SIZE = 5 - private readonly CONCURRENCY = 5 + private readonly BATCH_SIZE = 4 + private readonly CONCURRENCY = 2 private readonly MIN_TEXT_LENGTH = 1000 constructor(provider: OcrProvider) { super(provider) @@ -40,6 +40,7 @@ export default class MacSysOcrProvider extends BaseOcrProvider { // Process batch const ocrResults = await MacOCR.recognizeBatchFromBuffer(pageBuffers, { + maxThreads: 4, ocrOptions: { recognitionLevel: MacOCR.RECOGNITION_LEVEL_ACCURATE } @@ -103,7 +104,7 @@ export default class MacSysOcrProvider extends BaseOcrProvider { await new Promise((resolve, reject) => { writeStream.end(() => { - Logger.info('[OCR] OCR process completed successfully') + Logger.info(`[OCR] OCR process completed successfully for ${file.origin_name}`) resolve() }) writeStream.on('error', reject) diff --git a/src/renderer/src/hooks/useKnowledge.ts b/src/renderer/src/hooks/useKnowledge.ts index 509a5415c..287e8361d 100644 --- a/src/renderer/src/hooks/useKnowledge.ts +++ b/src/renderer/src/hooks/useKnowledge.ts @@ -1,4 +1,3 @@ -/* eslint-disable react-hooks/rules-of-hooks */ import { db } from '@renderer/databases/index' import KnowledgeQueue from '@renderer/queue/KnowledgeQueue' import FileManager from '@renderer/services/FileManager' @@ -21,7 +20,7 @@ import { } from '@renderer/store/knowledge' import { FileType, KnowledgeBase, KnowledgeItem, ProcessingStatus } from '@renderer/types' import { runAsyncFunction } from '@renderer/utils' -import { useEffect, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { v4 as uuidv4 } from 'uuid' @@ -189,62 +188,18 @@ export const useKnowledge = (baseId: string) => { } // 获取特定项目的处理状态 - const getProcessingStatus = (itemId: string) => { - return base?.items.find((item) => item.id === itemId)?.processingStatus - } + const getProcessingStatus = useCallback( + (itemId: string) => { + return base?.items.find((item) => item.id === itemId)?.processingStatus + }, + [base?.items] + ) // 获取特定类型的所有处理项 const getProcessingItemsByType = (type: 'file' | 'url' | 'note') => { return base?.items.filter((item) => item.type === type && item.processingStatus !== undefined) || [] } - // 获取目录处理进度 - const getDirectoryProcessingPercent = (itemId?: string) => { - const [percent, setPercent] = useState(0) - - useEffect(() => { - if (!itemId) { - return - } - - const cleanup = window.electron.ipcRenderer.on( - 'directory-processing-percent', - (_, { itemId: id, percent }: { itemId: string; percent: number }) => { - if (itemId === id) { - setPercent(percent) - } - } - ) - - return () => { - cleanup() - } - }, [itemId]) - - return percent - } - - // 获取文件ocr处理进度 - const getFileOcrProgress = (itemId: string) => { - const [progress, setProgress] = useState(0) - useEffect(() => { - const cleanup = window.electron.ipcRenderer.on( - 'file-ocr-progress', - (_, { itemId: id, progress }: { itemId: string; progress: number }) => { - if (itemId === id) { - setProgress(progress) - } - } - ) - - return () => { - cleanup() - } - }, [itemId]) - - return progress - } - // 清除已完成的项目 const clearCompleted = () => { dispatch(clearCompletedProcessing({ baseId })) @@ -327,8 +282,6 @@ export const useKnowledge = (baseId: string) => { refreshItem, getProcessingStatus, getProcessingItemsByType, - getDirectoryProcessingPercent, - getFileOcrProgress, clearCompleted, clearAll, removeItem, diff --git a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx index dc7a80ffe..20d04b2c3 100644 --- a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx +++ b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx @@ -21,7 +21,7 @@ import { getProviderName } from '@renderer/services/ProviderService' import { FileType, FileTypes, KnowledgeBase, KnowledgeItem } from '@renderer/types' import { bookExts, documentExts, textExts, thirdPartyApplicationExts } from '@shared/config/constant' import { Alert, Button, Card, Divider, Dropdown, message, Tag, Tooltip, Typography, Upload } from 'antd' -import { FC } from 'react' +import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -39,6 +39,25 @@ interface KnowledgeContentProps { const fileTypes = [...bookExts, ...thirdPartyApplicationExts, ...documentExts, ...textExts] const KnowledgeContent: FC = ({ selectedBase }) => { const { t } = useTranslation() + const [progressMap, setProgressMap] = useState>(new Map()) + + useEffect(() => { + const handlers = [ + window.electron.ipcRenderer.on('file-ocr-progress', (_, { itemId, progress }) => { + console.log('[Progress] File OCR:', itemId, progress) + setProgressMap((prev) => new Map(prev).set(itemId, progress)) + }), + + window.electron.ipcRenderer.on('directory-processing-percent', (_, { itemId, percent }) => { + console.log('[Progress] Directory:', itemId, percent) + setProgressMap((prev) => new Map(prev).set(itemId, percent)) + }) + ] + + return () => { + handlers.forEach((cleanup) => cleanup()) + } + }, []) const { base, @@ -54,8 +73,6 @@ const KnowledgeContent: FC = ({ selectedBase }) => { addSitemap, removeItem, getProcessingStatus, - getDirectoryProcessingPercent, - getFileOcrProgress, addNote, addDirectory, updateItem @@ -69,13 +86,6 @@ const KnowledgeContent: FC = ({ selectedBase }) => { return null } - const getProgressingPercentForItem = (itemId: string) => getDirectoryProcessingPercent(itemId) - - const getFileOcrProgressForItem = (itemId: string) => { - console.log('[KnowledgeContent] getFileOcrProgressForItem:', itemId) - return getFileOcrProgress(itemId) - } - const handleAddFile = () => { if (disabled) { return @@ -282,8 +292,8 @@ const KnowledgeContent: FC = ({ selectedBase }) => { sourceId={item.id} base={base} getProcessingStatus={getProcessingStatus} - getProcessingPercent={getFileOcrProgressForItem} type="file" + progress={progressMap.get(item.id)} />