fix: knowledge base not delete and websearch rag error (#10595)

* fix: knowledge base not  delete

* fix: websearch rag error

* chore: add comment
This commit is contained in:
Chen Tao 2025-10-09 22:29:52 +08:00 committed by GitHub
parent 2399db4944
commit 89bb830b60
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 22 additions and 19 deletions

View File

@ -29,7 +29,7 @@ import Reranker from '@main/knowledge/reranker/Reranker'
import { fileStorage } from '@main/services/FileStorage' import { fileStorage } from '@main/services/FileStorage'
import { windowService } from '@main/services/WindowService' import { windowService } from '@main/services/WindowService'
import { getDataPath } from '@main/utils' 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 { TraceMethod } from '@mcp-trace/trace-core'
import { MB } from '@shared/config/constant' import { MB } from '@shared/config/constant'
import type { LoaderReturn } from '@shared/config/types' 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 * Delete knowledge base file
*/ */
private deleteKnowledgeFile = (id: string): boolean => { private deleteKnowledgeFile = (id: string): boolean => {
const dbPath = path.join(this.storageDir, id) const dbPath = this.getDbPath(id)
if (fs.existsSync(dbPath)) { if (fs.existsSync(dbPath)) {
try { try {
fs.rmSync(dbPath, { recursive: true }) fs.rmSync(dbPath, { recursive: true })
@ -244,7 +249,8 @@ class KnowledgeService {
dimensions dimensions
}) })
try { 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 // Save database instance for later closing
this.dbInstances.set(id, libSqlDb) this.dbInstances.set(id, libSqlDb)

View File

@ -223,7 +223,7 @@ const api = {
create: (base: KnowledgeBaseParams, context?: SpanContext) => create: (base: KnowledgeBaseParams, context?: SpanContext) =>
tracedInvoke(IpcChannel.KnowledgeBase_Create, context, base), tracedInvoke(IpcChannel.KnowledgeBase_Create, context, base),
reset: (base: KnowledgeBaseParams) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Reset, 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: ({ add: ({
base, base,
item, item,

View File

@ -360,7 +360,7 @@ export const useKnowledgeBases = () => {
const deleteKnowledgeBase = (baseId: string) => { const deleteKnowledgeBase = (baseId: string) => {
const base = bases.find((b) => b.id === baseId) const base = bases.find((b) => b.id === baseId)
if (!base) return if (!base) return
dispatch(deleteBase({ baseId, baseParams: getKnowledgeBaseParams(base) })) dispatch(deleteBase({ baseId }))
// remove assistant knowledge_base // remove assistant knowledge_base
const _assistants = assistants.map((assistant) => { const _assistants = assistants.map((assistant) => {

View File

@ -15,7 +15,7 @@ import {
WebSearchProviderResult, WebSearchProviderResult,
WebSearchStatus WebSearchStatus
} from '@renderer/types' } from '@renderer/types'
import { hasObjectKey, uuid } from '@renderer/utils' import { hasObjectKey, removeSpecialCharactersForFileName, uuid } from '@renderer/utils'
import { addAbortController } from '@renderer/utils/abortController' import { addAbortController } from '@renderer/utils/abortController'
import { formatErrorMessage } from '@renderer/utils/error' import { formatErrorMessage } from '@renderer/utils/error'
import { ExtractResults } from '@renderer/utils/extract' import { ExtractResults } from '@renderer/utils/extract'
@ -55,7 +55,7 @@ class WebSearchService {
dispose: (requestState: RequestState, requestId: string) => { dispose: (requestState: RequestState, requestId: string) => {
if (!requestState.searchBase) return if (!requestState.searchBase) return
window.api.knowledgeBase 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)) .catch((error) => logger.warn(`Failed to cleanup search base for ${requestId}:`, error))
} }
}) })
@ -216,6 +216,7 @@ class WebSearchService {
documentCount: number, documentCount: number,
requestId: string requestId: string
): Promise<KnowledgeBase> { ): Promise<KnowledgeBase> {
// requestId: eg: openai-responses-openai/gpt-5-timestamp-uuid
const baseId = `websearch-compression-${requestId}` const baseId = `websearch-compression-${requestId}`
const state = this.getRequestState(requestId) const state = this.getRequestState(requestId)
@ -226,7 +227,8 @@ class WebSearchService {
// 清理旧的知识库 // 清理旧的知识库
if (state.searchBase) { 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) { if (!config.embeddingModel) {
@ -462,7 +464,9 @@ class WebSearchService {
// 处理 summarize // 处理 summarize
if (questions[0] === 'summarize' && links && links.length > 0) { 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 && webSearchProvider.topicId &&
endSpan({ endSpan({
topicId: webSearchProvider.topicId, topicId: webSearchProvider.topicId,

View File

@ -1,14 +1,7 @@
import { loggerService } from '@logger' import { loggerService } from '@logger'
import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import FileManager from '@renderer/services/FileManager' import FileManager from '@renderer/services/FileManager'
import { import { FileMetadata, KnowledgeBase, KnowledgeItem, PreprocessProvider, ProcessingStatus } from '@renderer/types'
FileMetadata,
KnowledgeBase,
KnowledgeBaseParams,
KnowledgeItem,
PreprocessProvider,
ProcessingStatus
} from '@renderer/types'
const logger = loggerService.withContext('Store:Knowledge') const logger = loggerService.withContext('Store:Knowledge')
@ -28,13 +21,13 @@ const knowledgeSlice = createSlice({
state.bases.push(action.payload) 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) const base = state.bases.find((b) => b.id === action.payload.baseId)
if (base) { if (base) {
state.bases = state.bases.filter((b) => b.id !== action.payload.baseId) state.bases = state.bases.filter((b) => b.id !== action.payload.baseId)
const files = base.items.filter((item) => item.type === 'file') const files = base.items.filter((item) => item.type === 'file')
FileManager.deleteFiles(files.map((item) => item.content) as FileMetadata[]) 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)
} }
}, },