AI Memory
Graphiti — Temporal Knowledge Graphs for AI Agents logo

Graphiti — graphes de connaissances temporels pour Agent AI

Graphiti construit un graphe de connaissances temporel à partir de données en flux — chaque arête a une fenêtre de validité. Les Agent peuvent interroger non seulement « ce qui est vrai » mais aussi « ce qui était vrai et quand ».

Why Graphiti

La plupart des systèmes mémoire écrasent les faits quand ils changent. Graphiti garde l'historique. Quand un utilisateur dit « j'ai déménagé à Tokyo », Graphiti ne supprime pas l'ancien fait « vit à Berlin » — il fixe son timestamp valid_to et ouvre une nouvelle arête. Désormais votre Agent peut répondre naturellement à « où vivait William avant Tokyo ? ».

Le pari technique, c'est que les arêtes bi-temporelles (valid_from / valid_to plus created_at / invalidated_at) sont la bonne primitive pour la mémoire d'Agent. Cela reprend la façon dont la modélisation de données relationnelles gère l'historique, adaptée au modèle entité-relation que les LLMs produisent naturellement en extrayant des faits depuis du texte.

Graphiti est développé par l'équipe Zep mais publié comme bibliothèque indépendante. Utilisez-le en standalone quand vous voulez une mémoire graph-first sans le cadrage par session de Zep, ou intégrez-le dans des pipelines RAG plus larges qui ont besoin du modèle d'arête temporelle.

Quick Start — Neo4j + Graphiti

Graphiti extrait des entités et des arêtes typées de chaque épisode, puis les réconcilie avec le graphe existant. Quand le second épisode indique que William a déménagé à Singapour, Graphiti invalide l'ancienne arête Shenzhen (valid_to = 2026-04-14) et crée une nouvelle arête Singapour — l'historique est préservé.

# pip install graphiti-core
# docker run -p 7687:7687 -e NEO4J_AUTH=neo4j/password neo4j:5
import asyncio
from datetime import datetime, timezone
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType

g = Graphiti(
    "bolt://localhost:7687", "neo4j", "password",
)

async def main():
    await g.build_indices_and_constraints()

    # Add episodes (raw conversations or docs) — Graphiti extracts entities + edges
    await g.add_episode(
        name="intro",
        episode_body="William is the founder of KeepRule and lives in Shenzhen.",
        source=EpisodeType.text,
        reference_time=datetime(2026, 1, 10, tzinfo=timezone.utc),
        source_description="onboarding chat",
    )
    await g.add_episode(
        name="move",
        episode_body="William just moved from Shenzhen to Singapore.",
        source=EpisodeType.text,
        reference_time=datetime(2026, 4, 14, tzinfo=timezone.utc),
        source_description="weekly standup",
    )

    # Temporal query — agents can ask "what was true at a point in time"
    hits = await g.search(
        "Where does William live?",
        center_node_uuid=None,
    )
    for edge in hits:
        print(edge.fact, "valid:", edge.valid_at, "invalid:", edge.invalid_at)

asyncio.run(main())

Fonctionnalités clés

Arêtes bi-temporelles

Chaque arête suit à la fois le temps de l'événement (valid_from / valid_to — quand le fait était vrai dans le monde) et le temps système (created_at / invalidated_at — quand vous l'avez appris). Pattern bitemporel classique, adapté aux données extraites par LLM.

Ingestion en streaming

Conçu pour ingérer des épisodes de manière incrémentale — conversations, documents, événements d'API. Pas de réindexation par batch à l'arrivée de nouvelles données. L'extraction par LLM + le merge dans le graphe se font par épisode.

Récupération hybride

Parcours de graphe (walks de relations, BFS/DFS) combiné à la similarité vectorielle sur les descriptions de nœuds. Les requêtes peuvent être structurelles ("qui a travaillé avec X ?"), sémantiques ou les deux.

Flexibilité de schéma

Les types d'entités et de relations sont extraits par le LLM, pas déclarés à l'avance. Fonctionne à travers les domaines — même bibliothèque pour le support client, les dossiers médicaux ou la mémoire de codebase.

Backend Neo4j ou FalkorDB

Bases de données de graphe production-grade. Graphiti fait l'extraction et le merging intelligents ; la DB gère le stockage, les transactions et l'exécution des requêtes.

Intégration Zep

Zep utilise Graphiti en interne pour son service graphe. Vous pouvez utiliser l'un ou l'autre indépendamment ou ensemble — Zep pour la mémoire de session managée, Graphiti pour des pipelines graph-first personnalisés.

Comparaison

 Memory ModelHistoryQuery TypeBackend
Graphiticelui-ciTemporal knowledge graphFull bitemporal historyGraph + vector hybridNeo4j / FalkorDB
mem0Vector + optional graphOverwrites on updateVector similarityQdrant / Chroma / etc.
Neo4j GraphRAGStatic knowledge graphSnapshot at ingestGraph + vectorNeo4j
Microsoft GraphRAGCommunity-detected graphRebuilt on re-indexHierarchical summariesFilesystem / any DB

Cas d'usage

01. Santé et conformité

Scénarios où les faits historiques comptent légalement — « quel médicament le patient prenait-il en janvier ? ». Les arêtes bitemporelles sont le pattern standard pour les données régulées, désormais disponible pour les Agent LLM.

02. CRM et historique de compte

Assistants commerciaux qui doivent raisonner sur l'évolution des relations : « qui a décidé d'étendre le contrat, et quel était son rôle à ce moment-là ? »

03. Contexte ingénierie

Agent d'intelligence de code qui suivent quelle équipe possédait quel service au fil du temps, y compris les reorgs et les transferts de propriété. De simples tables « current owner » perdent l'historique pré-reorg.

Tarification et licence

Graphiti : open source Apache 2.0. Pas de frais de service — self-host aux côtés de Neo4j Community (gratuit) ou FalkorDB (basé sur Redis, gratuit). Vous payez les appels d'API LLM d'extraction et l'infra graph DB.

Coût graph DB : le tier gratuit Neo4j AuraDB couvre les petits graphes (~200K nœuds). Pour la production, Neo4j AuraDB Professional démarre autour de 65 $/mois, ou self-host Neo4j Community sur votre propre infra.

Coût d'extraction LLM : chaque épisode déclenche un appel d'extraction d'entités/arêtes. ~0,001 $ par épisode sur gpt-4o-mini. Le modèle d'extraction est configurable.

Assets associés sur TokRepo

Questions fréquentes

Graphiti vs Microsoft GraphRAG — quelle différence ?+

Microsoft GraphRAG construit un graphe statique à partir d'un corpus de documents au moment de l'indexation et interroge des résumés hiérarchiques. Graphiti construit un graphe temporel évolutif à partir d'épisodes en streaming et interroge des arêtes individuelles avec des filtres temporels. Utilisez GraphRAG pour les grandes bases de connaissances statiques ; utilisez Graphiti pour la mémoire d'Agent qui évolue dans le temps.

Faut-il connaître les graph databases pour utiliser Graphiti ?+

Non — Graphiti abstrait les requêtes Cypher/graphe derrière une API Python. Vous écrivez des appels .add_episode() et .search(). Connaître Neo4j aide pour le debug ou l'écriture de requêtes custom, mais n'est pas requis pour un usage typique.

Graphiti peut-il remplacer ma base vectorielle ?+

Pour la mémoire, oui — Graphiti embed les descriptions de nœuds et fait une recherche hybride graphe + vectorielle en interne. Pour du RAG généraliste sur documents, gardez une vector DB séparée. Graphiti est optimisé pour la mémoire centrée sur les entités, pas pour la récupération de documents longs.

Graphiti est-il production-ready ?+

Graphiti est utilisé en production par l'équipe Zep (il alimente le service graphe de Zep) et par une liste grandissante de tiers listés sur le README GitHub. L'API est stable ; attendez-vous à des scripts de migration occasionnels à mesure que la bibliothèque mûrit.

Avec quels LLMs Graphiti fonctionne-t-il ?+

OpenAI, Anthropic Claude, Google Gemini, Azure OpenAI, et les modèles locaux via un endpoint compatible OpenAI (Ollama, vLLM). Configurez le client LLM dans le constructeur de Graphiti — l'extraction et la recherche utilisent le même client par défaut.

Comparer les alternatives