fix: memory retrieval bug

This commit is contained in:
ikechan8370 2025-11-05 15:45:34 +08:00
parent 9a5fe1d610
commit e8d655d87b

View file

@ -587,39 +587,65 @@ function createVectorTable (db, dimension) {
function ensureVectorTable (db) { function ensureVectorTable (db) {
ensureMetaTable(db) ensureMetaTable(db)
if (cachedVectorDimension) { if (cachedVectorDimension !== null) {
return cachedVectorDimension return cachedVectorDimension
} }
const preferredDimension = resolvePreferredDimension()
const stored = getMetaValue(db, META_VECTOR_DIM_KEY) const stored = getMetaValue(db, META_VECTOR_DIM_KEY)
const storedModel = getMetaValue(db, META_VECTOR_MODEL_KEY) const storedModel = getMetaValue(db, META_VECTOR_MODEL_KEY)
const currentModel = ChatGPTConfig.llm?.embeddingModel || '' const currentModel = ChatGPTConfig.llm?.embeddingModel || ''
const tableExists = Boolean(db.prepare(`
SELECT name FROM sqlite_master
WHERE type = 'table' AND name = 'vec_group_facts'
`).get())
const parseDimension = value => {
if (!value && value !== 0) return 0
const parsed = parseInt(String(value), 10)
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0
}
let dimension = parseDimension(stored)
let needsTableReset = false
if (dimension <= 0 && tableExists) {
needsTableReset = true
}
if (!storedModel || storedModel !== currentModel) { if (!storedModel || storedModel !== currentModel) {
needsTableReset = true
dimension = parseDimension(preferredDimension)
}
if (dimension <= 0 && preferredDimension > 0) {
dimension = preferredDimension
}
if (needsTableReset && tableExists) {
try { try {
db.exec('DROP TABLE IF EXISTS vec_group_facts') db.exec('DROP TABLE IF EXISTS vec_group_facts')
} catch (err) { } catch (err) {
logger?.warn?.('[Memory] failed to drop vec_group_facts during model change:', err) logger?.warn?.('[Memory] failed to drop vec_group_facts during model change:', err)
} }
setMetaValue(db, META_VECTOR_MODEL_KEY, currentModel)
setMetaValue(db, META_VECTOR_DIM_KEY, '0')
cachedVectorDimension = 0
cachedVectorModel = currentModel
return cachedVectorDimension
} }
let dimension = stored ? parseInt(stored, 10) : null
if (!dimension || Number.isNaN(dimension) || dimension <= 0) { let tablePresent = !needsTableReset && tableExists
cachedVectorDimension = 0 if (dimension > 0 && !tablePresent) {
return cachedVectorDimension try {
createVectorTable(db, dimension)
tablePresent = true
} catch (err) {
logger?.error?.('[Memory] failed to (re)create vec_group_facts table:', err)
dimension = 0
}
} }
const exists = db.prepare(`
SELECT name FROM sqlite_master setMetaValue(db, META_VECTOR_MODEL_KEY, currentModel)
WHERE type = 'table' AND name = 'vec_group_facts' setMetaValue(db, META_VECTOR_DIM_KEY, dimension > 0 ? String(dimension) : '0')
`).get()
if (!exists) { cachedVectorDimension = dimension > 0 ? dimension : 0
createVectorTable(db, dimension)
}
cachedVectorDimension = dimension
cachedVectorModel = currentModel cachedVectorModel = currentModel
return dimension return cachedVectorDimension
} }
export function resetVectorTableDimension (dimension) { export function resetVectorTableDimension (dimension) {
@ -699,6 +725,7 @@ export function getVectorDimension () {
export function resetCachedDimension () { export function resetCachedDimension () {
cachedVectorDimension = null cachedVectorDimension = null
cachedVectorModel = null
} }
export function resetMemoryDatabaseInstance () { export function resetMemoryDatabaseInstance () {
@ -711,4 +738,5 @@ export function resetMemoryDatabaseInstance () {
} }
dbInstance = null dbInstance = null
cachedVectorDimension = null cachedVectorDimension = null
cachedVectorModel = null
} }