Le registre officiel de la mémoire des agents v0.3.0 · pre-release · MIT

Le problème de la mémoire des agents

La mémoire des agents retient tout. Vrai ou faux.

Verimem est une couche de mémoire persistante dont le add() fait passer chaque écriture par une porte d'admission anti-confabulation — la source implique-t-elle vraiment le fait ? — et dont le search() renvoie la provenance à chaque lecture. Un hippocampe avec un notaire à la porte.

100 % gratuit et open source — licence MIT. Auto-hébergé, local-first : pas de compte, pas de clé API, pas de facturation.

Admisgrounding 0.97
Écriture candidate
«Le déploiement utilise PostgreSQL 16.»
source ⊢ fait — la note de version citée implique l'affirmation.
statut ADMIS · enregistré avec provenance.
§01 La porte d'admission

Les autres couches de mémoire enregistrent tout ce que produit leur extracteur. Pas Verimem.

À l'écriture, un fait candidat est admis, rétrogradé ou refusé — selon que la source citée l'implique vraiment. Un filtre lexical bon marché, sans LLM, rétrograde d'abord les affirmations non étayées du type «ça marche / vérifié / terminé» ; le mode le plus strict ajoute une vérification d'implication source⊢fait. Mesuré sur SNLI, il atteint AUROC 0.971, et ce chiffre est indépendant du juge.

Une revue structurée de mem0, Zep, Letta, Cognee et MemOS a constaté qu'aucun d'eux n'embarque de porte d'admission en écriture. Cette porte — plus la provenance que chaque lecture rapporte — c'est tout l'enjeu.

Illustratif — la porte en trois verdicts

Admis0.97
Écriture · impliquée
«Le déploiement utilise PostgreSQL 16.»
ADMIS · enregistré avec provenance
Rétrogradé0.41
Écriture · non étayée
«La migration est faite et tout fonctionne.»
RÉTROGRADÉ · conservé, signalé faible confiance
Refusé0.08
Écriture · contredite
«La limite de l'API est de 10 000 req/s.»
REFUSÉ · la source dit 1 000 — non enregistré

Provenance à chaque lecture

Les lectures ne renvoient pas que du texte — elles renvoient pour chaque fait son status et le grounding_score du moment de l'écriture, pour que ton code conditionne sur la confiance au lieu de faire une confiance aveugle. Et update() ne détruit jamais l'ancien fait : il le remplace (supersede), laissant une trace history() auditable.

memory.py · l'écriture passe par la porte, la lecture renvoie la provenance

from engram import Memory

mem = Memory()                                  # local SQLite, offline
mem.add("The deployment uses PostgreSQL 16.")   # write goes THROUGH the gate

for hit in mem.search("which database?"):       # read returns provenance
    print(hit["text"], hit["status"], hit["grounding_score"])
# -> The deployment uses PostgreSQL 16.  ADMITTED  0.97
§02 Preuves — mesurées, pas proclamées
MétriqueRésultatPour mémoire
Entailment de la porte d'écriture AUROC 0.971 Source⊢fait, indépendant du juge (SNLI). Le moat du chemin d'écriture.
Hallucination en aval 95.9% → 12.2% −83,7 pp ; McNemar p≈6e-44, répliqué sur 2 graines. Il fonctionne en convertissant la confabulation en abstention (omission 3%→85%), pas en augmentant la justesse — et ce bras est couplé au juge.
Over-rejection de faits propres 30–39% Le coût honnête au seuil strict. La porte locale distillée (v2) admet 0,924 des faits propres, ce qui referme en grande partie ce point.
Retrieval recall@5 · LongMemEval-s 0.8745 500 complet, sans juge, même embedder e5, zéro API externe. Fusion ON vs 0.8525 OFF (+2,2 pp). Un n=300 antérieur donnait 0.909 — optimiste ; le chiffre sur 500 complet est l'honnête. C'est du recall@k, pas une exactitude QA de bout en bout.
Retrieval en italien MRR +52% 0.466 → 0.710 en basculant sur l'embedder e5, à zéro régression en anglais.
Détection de contradictions · HaluMem TPR 0.66 / FPR 0.0125 Après la correction de la supersession temporelle.
Suite de tests 5 830 au vert 764 fichiers de test, ~84k lignes. Auto-exécutés, reproductibles depuis le repo.

Chaque chiffre ici est auto-exécuté et reproductible depuis le dépôt — ce n'est pas un classement tiers. Les nombres de retrieval sont du recall@k, pas l'exactitude QA de bout en bout que Mem0 et Zep mettent en avant, donc pas directement comparables.

§03 La différence — une combinaison honnête

01Porte d'admission en écriture

Admet, rétrograde ou refuse chaque écriture par implication de la source. Aucun concurrent ici n'en a.

02Provenance en lecture

Chaque fait renvoie status + grounding_score ; update() remplace, history() reste auditable.

03Valid-time bi-temporel

valid_until à expiration nette — une mémoire qui sait quand un fait a cessé d'être vrai.

04Tourne sur ton abonnement

Mode MCP hosted : pas de clé API, pas de facturation au token — le LLM de l'hôte fait le travail.

05Écran anti-injection multilingue

Un écran anti prompt-injection à l'écriture — italien inclus, pas seulement l'anglais.

06MCP-native

228 outils de mémoire au démarrage de session dans Claude Code, Cursor, Cline, Continue, Zed.

SystèmePorte d'écritureProvenance en lectureApprocheMaturité
Mem0 Vecteur plat + résumé LLM Établi, largement adopté
Zep / Graphiti partielle (temporelle) Graphe de connaissances temporel Commercial, mature
HippoRAG OpenIE + PageRank Recherche
Verimem Fusion recall + porte + consolidation pendant le sommeil Tout nouveau · 0 adoption pour l'instant

Les scores et l'adoption des concurrents varient selon la source et dans le temps ; les deux colonnes sur lesquelles nous tenons — une porte d'écriture et la provenance en lecture — viennent d'une revue structurée, pas d'un tableau marketing.

§04 Ce que Verimem n'est PAS
pour mémoire
  • 0 adoption.

    Une sortie publique toute neuve. Personne n'en dépend encore — nous compris, au-delà du poste quotidien du mainteneur.

  • Pas sur PyPI.

    Installation depuis les sources / git pour l'instant. Un paquet engram-memory est un objectif post-v0.4.0.

  • Benchmarks maison.

    Chaque chiffre est reproductible depuis le repo, mais aucun n'est audité par un tiers. À considérer comme reproductibles, pas certifiés.

  • SQLite mono-nœud.

    Mono-utilisateur et local. Le scoping multi-tenant existe au niveau des faits ; un store hébergé / distribué non.

  • Graphe d'entités regex-tier.

    Le moteur entités+PageRank est vivant sur des données réelles mais l'extracteur est du regex déterministe, exécuté en backfill — pas encore branché sur le chemin d'écriture live.

  • Answer-path non prouvé.

    Une revue adverse a jugé gonflée la première démo de conditionnement en réponse. Seul le moat du chemin d'écriture tient sur ses propres preuves — c'est donc tout ce que nous affirmons.

§05 Installer en 2 minutes

① Python — depuis les sources

pip install "git+https://github.com/aureliocpr-ctrl/verimem.git"

Fournit la commande engram et le SDK from engram import Memory. SQLite local, hors-ligne, porte active par défaut.

github.com/aureliocpr-ctrl/verimem ↗ · MIT · README · BENCHMARKS.md

② Comme serveur MCP — Claude Code, Cursor, Cline, Zed

{
  "mcpServers": {
    "engram": {
      "command": "engram",
      "args": ["mcp"],
      "env": { "ENGRAM_HOSTED": "1" }
    }
  }
}

Redémarre ton hôte ; les outils de mémoire deviennent appelables avec zéro clé API. Le moteur se distribue actuellement sous le nom engram — le renommage en Verimem est en cours.