fix: one more attempt by codex

This commit is contained in:
ikechan8370 2025-11-05 16:13:01 +08:00
parent e8d655d87b
commit b8f3563b84
3 changed files with 48 additions and 13 deletions

View file

@ -45,10 +45,11 @@ export function createChaiteVectorizer (model, dimensions) {
return {
async textToVector (text) {
const { client } = await getClientForModel(model)
const result = await client.getEmbedding(text, {
model,
dimensions
})
const options = { model }
if (Number.isFinite(dimensions) && dimensions > 0) {
options.dimensions = dimensions
}
const result = await client.getEmbedding(text, options)
return result.embeddings[0]
},
async batchTextToVector (texts) {
@ -63,10 +64,11 @@ export function createChaiteVectorizer (model, dimensions) {
for (let i = 0; i < channels.length; i++) {
const { quantity } = channels[i]
const slice = texts.slice(startIndex, startIndex + quantity)
const embeddings = await clients[i].getEmbedding(slice, {
model,
dimensions
})
const options = { model }
if (Number.isFinite(dimensions) && dimensions > 0) {
options.dimensions = dimensions
}
const embeddings = await clients[i].getEmbedding(slice, options)
results.push(...embeddings.embeddings)
startIndex += quantity
}

View file

@ -617,6 +617,12 @@ function ensureVectorTable (db) {
dimension = parseDimension(preferredDimension)
}
if (!needsTableReset && preferredDimension > 0 && dimension > 0 && dimension !== preferredDimension) {
logger?.info?.('[Memory] vector dimension change detected (stored=%s, preferred=%s), rebuilding vec_group_facts', dimension, preferredDimension)
needsTableReset = true
dimension = preferredDimension
}
if (dimension <= 0 && preferredDimension > 0) {
dimension = preferredDimension
}

View file

@ -307,16 +307,43 @@ export class GroupMemoryStore {
return []
}
try {
const dimension = getVectorDimension()
if (!dimension || dimension <= 0) {
logger.debug('[Memory] vector search skipped: vector dimension unavailable')
return []
let tableDimension = getVectorDimension() || 0
if (!tableDimension || tableDimension <= 0) {
logger.debug('[Memory] vector table dimension unavailable, attempting to infer from embedding')
}
const [embedding] = await embedTexts([queryText], this.embeddingModel, dimension)
const requestedDimension = tableDimension > 0 ? tableDimension : undefined
const [embedding] = await embedTexts([queryText], this.embeddingModel, requestedDimension)
if (!embedding) {
return []
}
const embeddingVector = ArrayBuffer.isView(embedding) ? embedding : Float32Array.from(embedding)
const actualDimension = embeddingVector.length
if (!actualDimension) {
logger.debug('[Memory] vector search skipped: empty embedding returned')
return []
}
if (tableDimension > 0 && actualDimension !== tableDimension) {
logger.warn(`[Memory] vector dimension mismatch detected during search, table=${tableDimension}, embedding=${actualDimension}. Rebuilding vector table.`)
try {
resetVectorTableDimension(actualDimension)
this.prepareVectorStatements()
tableDimension = actualDimension
} catch (resetErr) {
logger.error('Failed to reset vector table dimension during search:', resetErr)
return []
}
logger.info('[Memory] vector table rebuilt; old vectors must be regenerated before vector search can return results')
return []
} else if (tableDimension <= 0 && actualDimension > 0) {
try {
resetVectorTableDimension(actualDimension)
this.prepareVectorStatements()
tableDimension = actualDimension
} catch (resetErr) {
logger.error('Failed to initialise vector table dimension during search:', resetErr)
return []
}
}
const rows = this.db.prepare(`
SELECT gf.*, vec_group_facts.distance AS distance
FROM vec_group_facts