feat(private): memorie riservate escluse dalle ricerche standard

- gateway: campo private (bool) in MemoryIn; filtro must_not private=true
  di default in search_filter; include_private in SearchIn per ricerche
  esplicite; campo private esposto in format_results
- estensione: parametro private in qmem_store, include_private in qmem_search
  (con descrizioni e avvertenze sui prompt dei modelli)
- testato su brain: record private invisibile alla ricerca standard,
  visibile solo con include_private=true; topic esplicito da solo non sblocca
- deploy: /opt/memory/gateway ricostruito (container memory-gateway)
This commit is contained in:
enne2
2026-08-25 20:14:28 +02:00
parent 5a5081e5d9
commit 86ac1996fb
5 changed files with 29 additions and 1 deletions
+8 -1
View File
@@ -18,7 +18,13 @@ def search_filter(body: SearchIn) -> qm.Filter | None:
must.append(qm.FieldCondition(key=key, match=qm.MatchValue(value=value)))
if not body.include_superseded:
must.append(qm.IsEmptyCondition(is_empty=qm.PayloadField(key="superseded_by")))
return qm.Filter(must=must) if must else None
must_not: list[Any] = []
if not body.include_private:
# default: esclude i record riservati (private=true) dalle ricerche standard
must_not.append(qm.FieldCondition(key="private", match=qm.MatchValue(value=True)))
if must or must_not:
return qm.Filter(must=must or None, must_not=must_not or None)
return None
def search(qdrant: Any, collection: str, body: SearchIn, vector: list[float], sparse: Any) -> list[Any]:
@@ -64,6 +70,7 @@ def format_results(hits: list[Any]) -> list[dict]:
"parent_id": h.payload.get("parent_id"),
"level": h.payload.get("level"),
"topic": h.payload.get("topic"),
"private": h.payload.get("private", False),
"links": h.payload.get("links"),
}
for h in hits