Choosing an agent framework integration

An integration connects an agent framework’s lifecycle to stored memory: when a conversation is loaded, which context enters a prompt, and when messages or traces are written. The framework choice does not change the backend’s access rules or add unsupported memory operations.

Neo4j Agent Memory and these adapters are an experimental, community-supported Neo4j Labs project. An upstream framework’s stable or GA release does not imply official support for this integration.

Integration approaches

Framework Connection to memory Maintained guide

LangChain

Chat history, retriever, and create_agent middleware for the 1.x lifecycle

LangChain

PydanticAI

Injected memory dependencies and explicit memory tools

PydanticAI

LlamaIndex

Memory adapted to LlamaIndex’s conversation and retrieval abstractions

LlamaIndex

CrewAI

Memory for crew tasks and shared knowledge

CrewAI

OpenAI Agents SDK

Conversation access, memory tools, and trace helpers

OpenAI Agents SDK

Strands Agents

Memory tools, session management, and a memory store

Strands Agents

Microsoft Agent Framework

Context/history providers, tools, and trace helpers

Microsoft Agent Framework

Google ADK

Memory service integration

Google ADK

This table describes integration shapes, not a ranking or a promise that every adapter exposes every memory method. The linked guides own dependency ranges and setup details. In particular, the maintained LangChain adapter uses BaseChatMessageHistory and middleware; the old BaseMemory recipe is not the supported 1.x path. The Microsoft Agent Framework integration guide documents its own supported version range.

Choosing by application lifecycle

An existing framework is a useful starting point: keeping its message and execution abstractions reduces conversion work. For a new application, compare how each adapter fits the work you need to do:

  • A chat application needs explicit ownership of conversation history and persistence.

  • A retrieval application needs to turn retrieved memory into the framework’s expected context objects.

  • A tool-driven agent needs bounded memory tools and a policy for when it may call them.

  • A workflow with audits needs recorded steps, tool results, and outcomes, including failures.

The application still decides what retrieved material enters the prompt. Exposing a memory tool does not guarantee that a model will call it.

Memory layers and backend support

The short-term, long-term, and reasoning layers describe different records. An adapter may expose one layer directly and use another through the underlying client. Trace helpers must be connected to an application’s execution path; their existence does not make every agent run automatically observable.

Backend support is a separate question. Python supports Bolt and NAMS; TypeScript targets NAMS REST. Shared concepts do not imply identical operations or result shapes. Consult Backend capabilities and Bolt and NAMS before choosing an adapter around preferences, graph writes, extraction, or user scoping.

Dependency boundaries

Framework extras install the dependencies declared for that adapter. The model provider and application framework may require additional packages. Installing a broad extra is not a substitute for the selected guide’s prerequisites.

Use the Python integration guides or TypeScript integration overview for installation commands and supported versions. Test counts are not a compatibility contract.

Context, persistence, and retrieval

Context retrieval selects stored material relevant to the current task. Message storage persists an exchange. Search finds records by the supported semantic, property, or scope filters. These are distinct operations even when middleware combines them.

A useful integration design makes the actor explicit: an application invokes a client, framework middleware runs a hook, or a model chooses a tool. It also identifies where identifiers come from and whether a new process can reopen the same conversation. See the linked integration guide for method signatures and an executable path.

Execution and cost tradeoffs

An asynchronous interface lets an application await I/O without blocking its event loop. A synchronous bridge has different lifecycle constraints. Neither style alone establishes a throughput ranking: database latency, retrieval size, extraction work, model calls, and concurrency also matter.

On Bolt, embedding and extraction settings affect client-side work. On NAMS, those operations are managed by the service. Measure the configured path on representative conversations, including a failed agent/tool turn, rather than assuming every adapter accepts the same tuning flags.

What changes when switching frameworks

Keeping the same compatible backend can preserve stored records while an application changes frameworks. The application must still carry forward the correct workspace, conversation IDs, user filters where supported, and message-role conversions. A new client object or a repeated user name does not automatically resume a prior conversation.

Follow Migrate to NAMS for a backend change. For a framework change, use the destination integration guide and verify storage followed by retrieval from a fresh client before replacing an existing path.

Choosing a memory boundary

Assign one owner to each write. If application code and middleware both persist a turn, the same exchange can be recorded twice. Keep retrieval scope explicit and pass only the context needed for the agent’s task.

Multiple agents may share a graph while using separate conversations. That is a coordination choice, not an access-control guarantee. Cross-agent sharing explains the distinction.

Locating integration failures

Import failures usually concern the installed framework/provider packages or the version range. Lifecycle failures concern when a hook runs and which event loop owns an asynchronous client. Empty search results concern stored data, embeddings, query thresholds, or scope.

Use the relevant integration guide’s troubleshooting and verification steps to isolate these layers. Changing the framework does not correct a backend capability mismatch.