From 2b3f6d5640b0dc23647cba8685dbd1760ebe88c4 Mon Sep 17 00:00:00 2001 From: Chen Tao <70054568+eeee0717@users.noreply.github.com> Date: Thu, 9 Oct 2025 22:29:52 +0800 Subject: [PATCH] fix: knowledge base not delete and websearch rag error (#10595) * fix: knowledge base not delete * fix: websearch rag error * chore: add comment --- src/main/services/KnowledgeService.ts | 12 +++++++++--- src/preload/index.ts | 2 +- src/renderer/src/hooks/useKnowledge.ts | 2 +- src/renderer/src/services/WebSearchService.ts | 12 ++++++++---- src/renderer/src/store/knowledge.ts | 13 +++---------- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index 1ccd25008d..4e8707b2b7 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -29,7 +29,7 @@ import Reranker from '@main/knowledge/reranker/Reranker' import { fileStorage } from '@main/services/FileStorage' import { windowService } from '@main/services/WindowService' import { getDataPath } from '@main/utils' -import { getAllFiles } from '@main/utils/file' +import { getAllFiles, sanitizeFilename } from '@main/utils/file' import { TraceMethod } from '@mcp-trace/trace-core' import { MB } from '@shared/config/constant' import type { LoaderReturn } from '@shared/config/types' @@ -147,11 +147,16 @@ class KnowledgeService { } } + private getDbPath = (id: string): string => { + // 消除网络搜索requestI d中的特殊字符 + return path.join(this.storageDir, sanitizeFilename(id, '_')) + } + /** * Delete knowledge base file */ private deleteKnowledgeFile = (id: string): boolean => { - const dbPath = path.join(this.storageDir, id) + const dbPath = this.getDbPath(id) if (fs.existsSync(dbPath)) { try { fs.rmSync(dbPath, { recursive: true }) @@ -244,7 +249,8 @@ class KnowledgeService { dimensions }) try { - const libSqlDb = new LibSqlDb({ path: path.join(this.storageDir, id) }) + const dbPath = this.getDbPath(id) + const libSqlDb = new LibSqlDb({ path: dbPath }) // Save database instance for later closing this.dbInstances.set(id, libSqlDb) diff --git a/src/preload/index.ts b/src/preload/index.ts index a2229c0ccb..0cdbca5806 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -221,7 +221,7 @@ const api = { create: (base: KnowledgeBaseParams, context?: SpanContext) => tracedInvoke(IpcChannel.KnowledgeBase_Create, context, base), reset: (base: KnowledgeBaseParams) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Reset, base), - delete: (base: KnowledgeBaseParams, id: string) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Delete, base, id), + delete: (id: string) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Delete, id), add: ({ base, item, diff --git a/src/renderer/src/hooks/useKnowledge.ts b/src/renderer/src/hooks/useKnowledge.ts index 3bc0c085c3..983ddb54eb 100644 --- a/src/renderer/src/hooks/useKnowledge.ts +++ b/src/renderer/src/hooks/useKnowledge.ts @@ -360,7 +360,7 @@ export const useKnowledgeBases = () => { const deleteKnowledgeBase = (baseId: string) => { const base = bases.find((b) => b.id === baseId) if (!base) return - dispatch(deleteBase({ baseId, baseParams: getKnowledgeBaseParams(base) })) + dispatch(deleteBase({ baseId })) // remove assistant knowledge_base const _assistants = assistants.map((assistant) => { diff --git a/src/renderer/src/services/WebSearchService.ts b/src/renderer/src/services/WebSearchService.ts index d7d30c1dbc..bdcadb9785 100644 --- a/src/renderer/src/services/WebSearchService.ts +++ b/src/renderer/src/services/WebSearchService.ts @@ -15,7 +15,7 @@ import { WebSearchProviderResult, WebSearchStatus } from '@renderer/types' -import { hasObjectKey, uuid } from '@renderer/utils' +import { hasObjectKey, removeSpecialCharactersForFileName, uuid } from '@renderer/utils' import { addAbortController } from '@renderer/utils/abortController' import { formatErrorMessage } from '@renderer/utils/error' import { ExtractResults } from '@renderer/utils/extract' @@ -55,7 +55,7 @@ class WebSearchService { dispose: (requestState: RequestState, requestId: string) => { if (!requestState.searchBase) return window.api.knowledgeBase - .delete(getKnowledgeBaseParams(requestState.searchBase), requestState.searchBase.id) + .delete(removeSpecialCharactersForFileName(requestState.searchBase.id)) .catch((error) => logger.warn(`Failed to cleanup search base for ${requestId}:`, error)) } }) @@ -216,6 +216,7 @@ class WebSearchService { documentCount: number, requestId: string ): Promise { + // requestId: eg: openai-responses-openai/gpt-5-timestamp-uuid const baseId = `websearch-compression-${requestId}` const state = this.getRequestState(requestId) @@ -226,7 +227,8 @@ class WebSearchService { // 清理旧的知识库 if (state.searchBase) { - await window.api.knowledgeBase.delete(getKnowledgeBaseParams(state.searchBase), state.searchBase.id) + // 将requestId中的 '/' 映射为 '_' + await window.api.knowledgeBase.delete(removeSpecialCharactersForFileName(state.searchBase.id)) } if (!config.embeddingModel) { @@ -462,7 +464,9 @@ class WebSearchService { // 处理 summarize if (questions[0] === 'summarize' && links && links.length > 0) { - const contents = await fetchWebContents(links, undefined, undefined, { signal }) + const contents = await fetchWebContents(links, undefined, undefined, { + signal + }) webSearchProvider.topicId && endSpan({ topicId: webSearchProvider.topicId, diff --git a/src/renderer/src/store/knowledge.ts b/src/renderer/src/store/knowledge.ts index 49f14d4883..f74752b21e 100644 --- a/src/renderer/src/store/knowledge.ts +++ b/src/renderer/src/store/knowledge.ts @@ -1,14 +1,7 @@ import { loggerService } from '@logger' import { createSlice, PayloadAction } from '@reduxjs/toolkit' import FileManager from '@renderer/services/FileManager' -import { - FileMetadata, - KnowledgeBase, - KnowledgeBaseParams, - KnowledgeItem, - PreprocessProvider, - ProcessingStatus -} from '@renderer/types' +import { FileMetadata, KnowledgeBase, KnowledgeItem, PreprocessProvider, ProcessingStatus } from '@renderer/types' const logger = loggerService.withContext('Store:Knowledge') @@ -28,13 +21,13 @@ const knowledgeSlice = createSlice({ state.bases.push(action.payload) }, - deleteBase(state, action: PayloadAction<{ baseId: string; baseParams: KnowledgeBaseParams }>) { + deleteBase(state, action: PayloadAction<{ baseId: string }>) { const base = state.bases.find((b) => b.id === action.payload.baseId) if (base) { state.bases = state.bases.filter((b) => b.id !== action.payload.baseId) const files = base.items.filter((item) => item.type === 'file') FileManager.deleteFiles(files.map((item) => item.content) as FileMetadata[]) - window.api.knowledgeBase.delete(action.payload.baseParams, action.payload.baseId) + window.api.knowledgeBase.delete(action.payload.baseId) } },