Skip to content

Commit 85a6353

Browse files
fix(memory): prevent empty expected model in memory index identity
Guard memory index identity resolution against empty or whitespace provider models by falling back to fts-only, and use fts-only as the fallback source model when an adapter fallback cannot resolve a model. This prevents empty expectedModel mismatch reasons that can leave memory search dirty while preserving registered adapter default-model resolution. Refs #90787
1 parent 0888deb commit 85a6353

3 files changed

Lines changed: 37 additions & 2 deletions

File tree

extensions/memory-core/src/memory/manager-reindex-state.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,4 +273,39 @@ describe("memory reindex state", () => {
273273
),
274274
).toBe(false);
275275
});
276+
277+
it("falls back to fts-only when provider.model is an empty string", () => {
278+
expect(
279+
resolveMemoryIndexIdentityState(
280+
createIdentityParams({
281+
provider: { id: "openai", model: "" },
282+
meta: createMeta({ model: "fts-only" }),
283+
}),
284+
),
285+
).toEqual({ status: "valid" });
286+
});
287+
288+
it("reports mismatch when empty-string expected model is compared to a non-fts index", () => {
289+
const state = resolveMemoryIndexIdentityState(
290+
createIdentityParams({
291+
provider: { id: "openai", model: "" },
292+
meta: createMeta({ model: "text-embedding-3-small" }),
293+
}),
294+
);
295+
expect(state.status).toBe("mismatched");
296+
if (state.status === "mismatched") {
297+
expect(state.reason).toContain("expected fts-only");
298+
}
299+
});
300+
301+
it("falls back to fts-only when provider.model is whitespace-only", () => {
302+
expect(
303+
resolveMemoryIndexIdentityState(
304+
createIdentityParams({
305+
provider: { id: "openai", model: " " },
306+
meta: createMeta({ model: "fts-only" }),
307+
}),
308+
),
309+
).toEqual({ status: "valid" });
310+
});
276311
});

extensions/memory-core/src/memory/manager-reindex-state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export function resolveMemoryIndexIdentityState(params: {
159159
if (!meta) {
160160
return { status: "missing", reason: "index metadata is missing" };
161161
}
162-
const expectedModel = params.provider ? params.provider.model : "fts-only";
162+
const expectedModel = params.provider?.model?.trim() || "fts-only";
163163
const matchingModelIdentities = [
164164
{ model: expectedModel, providerKey: params.providerKey },
165165
...(params.providerAliases ?? []),

extensions/memory-core/src/memory/manager-sync-ops.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ export abstract class MemoryManagerSyncOps {
517517
this.settings.provider,
518518
model:
519519
this.settings.model.trim() ||
520-
resolveEmbeddingProviderFallbackModel(this.settings.provider, "", this.cfg),
520+
resolveEmbeddingProviderFallbackModel(this.settings.provider, "fts-only", this.cfg),
521521
});
522522
const provider = hasProviderOverride
523523
? params.provider!

0 commit comments

Comments
 (0)