From b8f3563b8428f25f9c9b5c4d403f41fc4bc15a17 Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Wed, 5 Nov 2025 16:13:01 +0800 Subject: [PATCH] fix: one more attempt by codex --- models/chaite/vectorizer.js | 18 ++++++++------- models/memory/database.js | 6 +++++ models/memory/groupMemoryStore.js | 37 ++++++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/models/chaite/vectorizer.js b/models/chaite/vectorizer.js index a67ffae..60b8f60 100644 --- a/models/chaite/vectorizer.js +++ b/models/chaite/vectorizer.js @@ -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 } diff --git a/models/memory/database.js b/models/memory/database.js index fd2b739..75316d1 100644 --- a/models/memory/database.js +++ b/models/memory/database.js @@ -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 } diff --git a/models/memory/groupMemoryStore.js b/models/memory/groupMemoryStore.js index 42b68d7..459c3c0 100644 --- a/models/memory/groupMemoryStore.js +++ b/models/memory/groupMemoryStore.js @@ -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