Framework Integrations

Each first-class agent framework ships a thin wrapper around MemoryClient. Pick yours below.

Vercel AI SDK (TypeScript)

The agentMemoryMiddleware injects three-tier context (reflections
observations + recent messages) into every model call and persists the assistant’s response.

import { generateText } from "ai";
import { MemoryClient } from "@neo4j-labs/agent-memory";
import { agentMemoryMiddleware } from "@neo4j-labs/agent-memory/middleware/vercel-ai";

const client = new MemoryClient({ endpoint: "https://memory.neo4jlabs.com/v1", apiKey });

const result = await generateText({
  model: openai("gpt-4o"),
  experimental_middleware: agentMemoryMiddleware(client, {
    conversationId: "conv-uuid",
    userId: "alice@example.com",
    includeContext: true,
    persistResponses: true,
  }),
  messages: [{ role: "user", content: "What did we decide?" }],
});

LangChain JS (TypeScript)

Neo4jChatMessageHistory is a drop-in ChatMessageHistory backed by memory; Neo4jEntityRetriever returns memory entities as LangChain `Document`s.

import {
  Neo4jChatMessageHistory,
  Neo4jEntityRetriever,
} from "@neo4j-labs/agent-memory/integrations/langchain";

const history = new Neo4jChatMessageHistory(client, "conv-uuid");
await history.addUserMessage("hello");

const retriever = new Neo4jEntityRetriever(client, { topK: 4 });
const docs = await retriever.invoke("Find entities about Acme Corp");

Mastra (TypeScript)

Neo4jMastraMemory wraps MemoryClient as a Mastra Memory provider.

import { Neo4jMastraMemory } from "@neo4j-labs/agent-memory/integrations/mastra";
import { Agent } from "@mastra/core/agent";

const memory = new Neo4jMastraMemory(client);
const agent = new Agent({ name: "scout", memory });

LangGraph (Python)

MemoryCheckpointSaver persists LangGraph state under a memory conversation.

from neo4j_agent_memory_client import MemoryClient
from neo4j_agent_memory_client.integrations.langgraph import MemoryCheckpointSaver

client = MemoryClient(endpoint="https://memory.neo4jlabs.com/v1", api_key=...)
saver = MemoryCheckpointSaver(client)

graph = StateGraph(MyState)
graph.compile(checkpointer=saver)

PydanticAI (Python)

inject_memory_context returns a system-prompt prefix; MemoryToolset exposes the 12 memory tools as PydanticAI tools.

from pydantic_ai import Agent
from neo4j_agent_memory_client import MemoryClient
from neo4j_agent_memory_client.integrations.pydantic_ai import (
    MemoryToolset, inject_memory_context,
)

client = MemoryClient(endpoint=..., api_key=...)
toolset = MemoryToolset(client)

@agent.system_prompt
async def memory_context() -> str:
    return await inject_memory_context(client, conversation_id="...")

agent = Agent(model="openai:gpt-4o", tools=[*toolset.tools()])

Semantic Kernel (C#)

MemoryConnector provides save/search and a GetContextPrefixAsync helper suitable for SK kernel functions.

using Neo4j.AgentMemory.Integrations.SemanticKernel;

var client = new MemoryClient(...);
var connector = new MemoryConnector(client);

await connector.SaveAsync(collection: "concept", id: "ddd", text: "Domain-Driven Design");
var hits = await connector.SearchAsync("microservice patterns", limit: 5);
var contextPrefix = await connector.GetContextPrefixAsync(conversationId);

ellmer ®

register_memory_tools(client) returns a list of ellmer tool() definitions wrapping all 12 memory tools.

library(neo4j.memory)
library(ellmer)

client <- MemoryClient$new(endpoint = "...", api_key = ...)
tools <- register_memory_tools(client)

chat <- chat_openai(model = "gpt-4o")
for (t in tools) chat$register_tool(t$name, t$description, t$handler)