From 6c2417eab7856586de2fd67a52b5e43ce7f1e536 Mon Sep 17 00:00:00 2001 From: Matteo Benedetto Date: Sun, 16 Aug 2026 19:45:18 +0200 Subject: [PATCH] feat: avviso duplicati in qmem_store (search pre-salvataggio, soglia 0.92, non blocca) - prima di salvare: ricerca top-3 con min_score 0.92 e stesso project_id - se trovati: avviso nella risposta con id/score/testo dei candidati e suggerimento qmem_correct - il salvataggio non viene bloccato - verificato sul server: record quasi identici trovati con score 1.0/0.9908 --- extensions/index.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/extensions/index.ts b/extensions/index.ts index a314d6a..5e93259 100644 --- a/extensions/index.ts +++ b/extensions/index.ts @@ -209,6 +209,16 @@ export default function qmemExtension(pi: ExtensionAPI) { } const p = params as any; onUpdate?.({ content: [{ type: "text", text: "qmem: salvataggio record..." }] }); + // Rilevamento duplicati: cerca prima di salvare (soglia alta, non blocca) + let dupes: any[] = []; + const dupCheck = await gatewayRequest( + cfg, + "POST", + "/v1/memories:search", + { query: p.text, project_id: p.project_id, top_k: 3, min_score: 0.92, include_superseded: false }, + signal, + ); + if (dupCheck.ok) dupes = dupCheck.data.results ?? []; // Idempotency: stessa key per tutta l'operazione (e per eventuali retry) const idemKey = crypto.randomUUID(); const { ok, status, data } = await gatewayRequest( @@ -236,9 +246,15 @@ export default function qmemExtension(pi: ExtensionAPI) { details: { error: "gateway_error", status }, }; } + const dupWarning = + dupes.length > 0 + ? "\n⚠️ Possibili duplicati (score >= 0.92, stesso project_id):\n" + + dupes.map((d: any) => ` - ${d.memory_id} (score ${d.score}): ${String(d.text).slice(0, 100)}`).join("\n") + + "\nValuta se il nuovo record è davvero necessario o se conviene qmem_correct sul duplicato." + : ""; return { - content: [{ type: "text", text: `Memoria salvata: ${data.memory_id} (${p.kind ?? "fact"}, scope ${p.scope ?? "agent"})${p.supersedes_id ? ` — supersede ${p.supersedes_id}` : ""}` }], - details: { memory_id: data.memory_id, created_at: data.created_at }, + content: [{ type: "text", text: `Memoria salvata: ${data.memory_id} (${p.kind ?? "fact"}, scope ${p.scope ?? "agent"})${p.supersedes_id ? ` — supersede ${p.supersedes_id}` : ""}${dupWarning}` }], + details: { memory_id: data.memory_id, created_at: data.created_at, duplicates: dupes.length }, }; }, });