diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index 43b11ebe..53f66130 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -15,6 +15,8 @@ import { FileType, KnowledgeBaseParams, KnowledgeItem } from '@types' import { app } from 'electron' import { v4 as uuidv4 } from 'uuid' +import { windowService } from './WindowService' + class KnowledgeService { private storageDir = path.join(app.getPath('userData'), 'Data', 'KnowledgeBase') @@ -83,10 +85,23 @@ class KnowledgeService { ): Promise => { const ragApplication = await this.getRagApplication(base) + const sendDirectoryProcessingPercent = (totalFiles: number, processedFiles: number) => { + const mainWindow = windowService.getMainWindow() + mainWindow?.webContents.send(base.id, (processedFiles / totalFiles) * 100) + } + if (item.type === 'directory') { const directory = item.content as string const files = getAllFiles(directory) - const loaderPromises = files.map((file) => addFileLoader(ragApplication, file, base, forceReload)) + const totalFiles = files.length + let processedFiles = 0 + const loaderPromises = files.map(async (file) => { + const result = await addFileLoader(ragApplication, file, base, forceReload) + processedFiles++ + + sendDirectoryProcessingPercent(totalFiles, processedFiles) + return result + }) const loaderResults = await Promise.all(loaderPromises) const uniqueIds = loaderResults.map((result) => result.uniqueId) return { diff --git a/src/renderer/src/hooks/useKnowledge.ts b/src/renderer/src/hooks/useKnowledge.ts index dbb90ca8..18a53324 100644 --- a/src/renderer/src/hooks/useKnowledge.ts +++ b/src/renderer/src/hooks/useKnowledge.ts @@ -198,6 +198,23 @@ export const useKnowledge = (baseId: string) => { return base?.items.filter((item) => item.type === type && item.processingStatus !== undefined) || [] } + // 获取目录处理进度 + const getDirectoryProcessingPercent = (itemId: string) => { + const [percent, setPercent] = useState(0) + + useEffect(() => { + const cleanup = window.electron.ipcRenderer.on(itemId, (_, progressingPercent: number) => { + setPercent(progressingPercent) + }) + + return () => { + cleanup() + } + }, [itemId]) + + return percent + } + // 清除已完成的项目 const clearCompleted = () => { dispatch(clearCompletedProcessing({ baseId })) @@ -280,6 +297,7 @@ export const useKnowledge = (baseId: string) => { refreshItem, getProcessingStatus, getProcessingItemsByType, + getDirectoryProcessingPercent, clearCompleted, clearAll, removeItem, diff --git a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx index ef4bb511..d4ebf062 100644 --- a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx +++ b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx @@ -53,6 +53,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { addSitemap, removeItem, getProcessingStatus, + getDirectoryProcessingPercent, addNote, addDirectory } = useKnowledge(selectedBase.id || '') @@ -63,6 +64,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { if (!base) { return null } + const progressingPercent = getDirectoryProcessingPercent(base?.id) const handleAddFile = () => { if (disabled) { @@ -113,7 +115,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { inputPlaceholder: t('knowledge.url_placeholder'), inputProps: { rows: 10, - onPressEnter: () => {} + onPressEnter: () => { } } }) @@ -271,7 +273,12 @@ const KnowledgeContent: FC = ({ selectedBase }) => { {item.uniqueId &&