Complete guide for using MemoryGraph with LlamaIndex for RAG pipelines and chat applications.

Installation

pip install memorygraphsdk[llamaindex]

This installs both memorygraphsdk and llama-index-core.

Overview

The MemoryGraph SDK provides two main integrations for LlamaIndex:

  • MemoryGraphChatMemory - For chat engines with persistent memory
  • MemoryGraphRetriever - For RAG pipelines using memories as knowledge base

Quick Start: Chat Memory

from memorygraphsdk.integrations.llamaindex import MemoryGraphChatMemory
from llama_index.core.chat_engine import SimpleChatEngine
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI

# Configure LlamaIndex
Settings.llm = OpenAI(model="gpt-4", temperature=0.7)

# Create memory with session isolation
memory = MemoryGraphChatMemory(
    api_key="mg_your_key_here",
    session_id="user_123"  # Optional: isolate conversations
)

# Create chat engine with memory
chat_engine = SimpleChatEngine.from_defaults(memory=memory)

# Have a conversation
response = chat_engine.chat("I'm working on a Redis timeout issue")
print(response)

# Memory persists - retrieve in next session
response = chat_engine.chat("What was I working on?")
print(response)  # Remembers Redis timeout!

MemoryGraphChatMemory API

Constructor

MemoryGraphChatMemory(
    api_key: str,
    session_id: str = "default",
    memory_key: str = "chat_history",
    return_messages: bool = True
)
Parameter Type Description
api_key str Your MemoryGraph API key
session_id str Session identifier for isolating conversations (default: "default")
memory_key str Key used for memory in context (default: "chat_history")
return_messages bool Return as message objects vs strings (default: True)

Methods

# Retrieve relevant memories for the input
messages = memory.get(input="Redis timeout")

# Store a message in memory
memory.put({
    "role": "user",
    "content": "How do I fix Redis timeouts?"
})

# Replace all messages in current session
memory.set_messages([
    {"role": "system", "content": "You are a helpful assistant"},
    {"role": "user", "content": "Hello"}
])

# Reset memory (no-op - memories are permanent)
memory.reset()

Multi-Session Chat Application

from memorygraphsdk.integrations.llamaindex import MemoryGraphChatMemory
from llama_index.core.chat_engine import SimpleChatEngine
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI

Settings.llm = OpenAI(model="gpt-4")

def create_chat_for_user(user_id: str):
    """Create a chat engine with user-specific memory."""
    memory = MemoryGraphChatMemory(
        api_key="mg_...",
        session_id=f"user_{user_id}"
    )
    return SimpleChatEngine.from_defaults(memory=memory)

# User 1's conversation
chat1 = create_chat_for_user("alice")
chat1.chat("I'm debugging a Redis issue")

# User 2's conversation (isolated)
chat2 = create_chat_for_user("bob")
chat2.chat("I'm optimizing SQL queries")

# Later - memories are preserved
chat1_new = create_chat_for_user("alice")
response = chat1_new.chat("What was I debugging?")
# Response: "You were debugging a Redis issue"

MemoryGraphRetriever API

Use MemoryGraph as a knowledge base for RAG pipelines.

Constructor

MemoryGraphRetriever(
    api_key: str,
    memory_types: list[str] | None = None,
    min_importance: float = 0.0,
    limit: int = 5
)
Parameter Type Description
api_key str Your MemoryGraph API key
memory_types list[str] Filter by memory types (default: ["solution", "code_pattern", "fix"])
min_importance float Minimum importance score (default: 0.0)
limit int Maximum results per query (default: 5)

Usage

from memorygraphsdk.integrations.llamaindex import MemoryGraphRetriever
from llama_index.core.query_engine import RetrieverQueryEngine

# Create retriever
memory_retriever = MemoryGraphRetriever(
    api_key="mg_...",
    memory_types=["solution", "fix", "code_pattern"],
    min_importance=0.7,
    limit=5
)

# Use in query engine
query_engine = RetrieverQueryEngine.from_args(
    retriever=memory_retriever,
    verbose=True
)

# Query using memories as knowledge base
response = query_engine.query("What's the best way to handle Redis timeouts?")
print(response)

Hybrid Search: Documents + Memories

from memorygraphsdk.integrations.llamaindex import MemoryGraphRetriever
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.retrievers import QueryFusionRetriever

# Load documents
documents = SimpleDirectoryReader("./docs").load_data()
doc_index = VectorStoreIndex.from_documents(documents)
doc_retriever = doc_index.as_retriever(similarity_top_k=5)

# Create memory retriever
memory_retriever = MemoryGraphRetriever(
    api_key="mg_...",
    memory_types=["solution"],
    limit=5
)

# Combine both retrievers
fusion_retriever = QueryFusionRetriever(
    retrievers=[doc_retriever, memory_retriever],
    similarity_top_k=10,
    num_queries=1
)

# Query across both sources
nodes = fusion_retriever.retrieve("Redis timeout solutions")
for node in nodes:
    print(f"- {node.text[:100]}...")

Learning Agent Pattern

Automatically store important learnings from conversations:

from memorygraphsdk import MemoryGraphClient
from memorygraphsdk.integrations.llamaindex import (
    MemoryGraphChatMemory,
    MemoryGraphRetriever
)
from llama_index.core.chat_engine import SimpleChatEngine

class LearningAgent:
    def __init__(self, api_key: str, session_id: str):
        self.client = MemoryGraphClient(api_key=api_key)
        self.session_id = session_id
        self.memory = MemoryGraphChatMemory(
            api_key=api_key,
            session_id=session_id
        )
        self.retriever = MemoryGraphRetriever(api_key=api_key)
        self.chat_engine = SimpleChatEngine.from_defaults(
            memory=self.memory
        )

    def chat(self, message: str):
        """Chat and automatically learn from important exchanges."""
        response = self.chat_engine.chat(message)

        # Extract and store important learnings
        if self._is_important(message, str(response)):
            self.client.create_memory(
                type="solution",
                title=message[:100],
                content=str(response),
                tags=self._extract_tags(message),
                importance=0.8,
                context={"session_id": self.session_id}
            )

        return response

    def recall_similar(self, query: str):
        """Recall similar past learnings."""
        return self.retriever.retrieve(query)

    def _is_important(self, message: str, response: str) -> bool:
        keywords = ["fix", "solve", "how to", "error", "issue"]
        return any(kw in message.lower() for kw in keywords)

    def _extract_tags(self, message: str) -> list[str]:
        common_tags = ["redis", "timeout", "database", "api"]
        return [tag for tag in common_tags if tag in message.lower()]

# Usage
agent = LearningAgent(api_key="mg_...", session_id="dev_session")
response = agent.chat("How do I fix Redis timeouts?")
# Important exchanges are automatically stored!

Best Practices

1. Use Session IDs for Isolation

# Good: Isolated sessions per user
memory = MemoryGraphChatMemory(
    api_key="mg_...",
    session_id=f"user_{user_id}"
)

# Avoid: Shared session for all users
memory = MemoryGraphChatMemory(api_key="mg_...")

2. Filter Memories by Type

# Retrieve only actionable memories
retriever = MemoryGraphRetriever(
    api_key="mg_...",
    memory_types=["solution", "fix", "code_pattern"],
    min_importance=0.5
)

3. Combine with Document Search

# Hybrid: Documents + Memories
fusion_retriever = QueryFusionRetriever(
    retrievers=[
        doc_retriever,      # Official documentation
        memory_retriever    # Team learnings
    ],
    similarity_top_k=10
)

Troubleshooting

Memory Not Persisting

Issue: Chat history not saved between sessions

Solution: Ensure you're using the same session_id:

# Session 1
memory1 = MemoryGraphChatMemory(
    api_key="mg_...",
    session_id="user_123"  # Use consistent ID
)

# Session 2 (later)
memory2 = MemoryGraphChatMemory(
    api_key="mg_...",
    session_id="user_123"  # Same ID
)

No Results from Retriever

Solution 1: Search all types:

retriever = MemoryGraphRetriever(
    api_key="mg_...",
    memory_types=None  # Search all types
)

Solution 2: Lower importance threshold:

retriever = MemoryGraphRetriever(
    api_key="mg_...",
    min_importance=0.0  # Include all importances
)

Next Steps