Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
langchain-ai avatar

Deep Agents Memory

  • 13.8k installs
  • 1.1k repo stars
  • Updated July 30, 2026
  • langchain-ai/langchain-skills

deep-agents-memory is a skill for configuring memory backends (StateBackend, StoreBackend, CompositeBackend) in Deep Agents, enabling ephemeral and persistent file operations

About

A skill for configuring memory and persistence in Deep Agents. Covers ephemeral (thread-scoped) and persistent (cross-thread) file storage, filesystem access, and hybrid routing. Developers use it when building agents that must retain state across sessions or coordinate file operations within a thread.

  • Pluggable backends: StateBackend (ephemeral), StoreBackend (persistent), CompositeBackend (hybrid routing)
  • Cross-thread persistence via StoreBackend with InMemoryStore or PostgresStore
  • FilesystemMiddleware provides tools: ls, read_file, write_file, edit_file, glob, grep

Deep Agents Memory by the numbers

  • 13,835 all-time installs (skills.sh)
  • +491 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #61 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

deep-agents-memory capabilities & compatibility

Use cases
planning · memory
Runs
Runs locally
npx skills add https://github.com/langchain-ai/langchain-skills --skill deep-agents-memory

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs13.8k
repo stars1.1k
Security audit3 / 3 scanners passed
Last updatedJuly 30, 2026
Repositorylangchain-ai/langchain-skills

How do you add persistent memory to LangChain Deep Agents?

Deep agent memory configuration, cross-session state persistence, thread-scoped file operations, and hybrid ephemeral/persistent storage routing

Who is it for?

Developers building Deep Agents that need cross-session memory, thread-scoped working files, or hybrid ephemeral/persistent storage

Skip if: Simple single-invocation stateless agents; applications not using Deep Agents framework

When should I use this skill?

Agent needs to persist state across threads, retain data across sessions, or route different paths to different storage backends

What you get

Configured Deep Agent backends and FilesystemMiddleware tools enabling thread-local or cross-session file and memory persistence.

  • backend configuration
  • filesystem middleware setup
  • persistent agent state

By the numbers

  • CompositeBackend matches longest prefix first in routing rules
  • FilesystemBackend requires virtual_mode=True for security (prevents ../ escapes)
  • StateBackend is default with no setup required

Files

SKILL.mdMarkdownGitHub ↗

<overview> Deep Agents use pluggable backends for file operations and memory:

Short-term (StateBackend): Persists within a single thread, lost when thread ends Long-term (StoreBackend): Persists across threads and sessions Hybrid (CompositeBackend): Route different paths to different backends

FilesystemMiddleware provides tools: ls, read_file, write_file, edit_file, glob, grep </overview>

<backend-selection>

Use CaseBackendWhy
Temporary working filesStateBackendDefault, no setup
Local development CLIFilesystemBackendDirect disk access
Cross-session memoryStoreBackendPersists across threads
Hybrid storageCompositeBackendMix ephemeral + persistent

</backend-selection>

<ex-default-state-backend> <python> Default StateBackend stores files ephemerally within a thread.

from deepagents import create_deep_agent

agent = create_deep_agent()  # Default: StateBackend
result = agent.invoke({
    "messages": [{"role": "user", "content": "Write notes to /draft.txt"}]
}, config={"configurable": {"thread_id": "thread-1"}})
# /draft.txt is lost when thread ends

</python> <typescript> Default StateBackend stores files ephemerally within a thread.

import { createDeepAgent } from "deepagents";

const agent = await createDeepAgent();  // Default: StateBackend
const result = await agent.invoke({
  messages: [{ role: "user", content: "Write notes to /draft.txt" }]
}, { configurable: { thread_id: "thread-1" } });
// /draft.txt is lost when thread ends

</typescript> </ex-default-state-backend>

<ex-composite-backend-for-hybrid> <python> Configure CompositeBackend to route paths to different storage backends.

from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
from langgraph.store.memory import InMemoryStore

store = InMemoryStore()

composite_backend = lambda rt: CompositeBackend(
    default=StateBackend(rt),
    routes={"/memories/": StoreBackend(rt)}
)

agent = create_deep_agent(backend=composite_backend, store=store)

# /draft.txt -> ephemeral (StateBackend)
# /memories/user-prefs.txt -> persistent (StoreBackend)

</python> <typescript> Configure CompositeBackend to route paths to different storage backends.

import { createDeepAgent, CompositeBackend, StateBackend, StoreBackend } from "deepagents";
import { InMemoryStore } from "@langchain/langgraph";

const store = new InMemoryStore();

const agent = await createDeepAgent({
  backend: (config) => new CompositeBackend(
    new StateBackend(config),
    { "/memories/": new StoreBackend(config) }
  ),
  store
});

// /draft.txt -> ephemeral (StateBackend)
// /memories/user-prefs.txt -> persistent (StoreBackend)

</typescript> </ex-composite-backend-for-hybrid>

<ex-cross-session-memory> <python> Files in /memories/ persist across threads via StoreBackend routing.

# Using CompositeBackend from previous example
config1 = {"configurable": {"thread_id": "thread-1"}}
agent.invoke({"messages": [{"role": "user", "content": "Save to /memories/style.txt"}]}, config=config1)

config2 = {"configurable": {"thread_id": "thread-2"}}
agent.invoke({"messages": [{"role": "user", "content": "Read /memories/style.txt"}]}, config=config2)
# Thread 2 can read file saved by Thread 1

</python> <typescript> Files in /memories/ persist across threads via StoreBackend routing.

// Using CompositeBackend from previous example
const config1 = { configurable: { thread_id: "thread-1" } };
await agent.invoke({ messages: [{ role: "user", content: "Save to /memories/style.txt" }] }, config1);

const config2 = { configurable: { thread_id: "thread-2" } };
await agent.invoke({ messages: [{ role: "user", content: "Read /memories/style.txt" }] }, config2);
// Thread 2 can read file saved by Thread 1

</typescript> </ex-cross-session-memory>

<ex-filesystem-backend-local-dev> <python> Use FilesystemBackend for local development with real disk access and human-in-the-loop.

from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend
from langgraph.checkpoint.memory import MemorySaver

agent = create_deep_agent(
    backend=FilesystemBackend(root_dir=".", virtual_mode=True),  # Restrict access
    interrupt_on={"write_file": True, "edit_file": True},
    checkpointer=MemorySaver()
)

# Agent can read/write actual files on disk

</python> <typescript> Use FilesystemBackend for local development with real disk access and human-in-the-loop.

import { createDeepAgent, FilesystemBackend } from "deepagents";
import { MemorySaver } from "@langchain/langgraph";

const agent = await createDeepAgent({
  backend: new FilesystemBackend({ rootDir: ".", virtualMode: true }),
  interruptOn: { write_file: true, edit_file: true },
  checkpointer: new MemorySaver()
});

</typescript>

Security: Never use FilesystemBackend in web servers - use StateBackend or sandbox instead. </ex-filesystem-backend-local-dev>

<ex-store-in-custom-tools> <python> Access the store directly in custom tools for long-term memory operations.

from langchain.tools import tool, ToolRuntime
from langchain.agents import create_agent
from langgraph.store.memory import InMemoryStore

@tool
def get_user_preference(key: str, runtime: ToolRuntime) -> str:
    """Get a user preference from long-term storage."""
    store = runtime.store
    result = store.get(("user_prefs",), key)
    return str(result.value) if result else "Not found"

@tool
def save_user_preference(key: str, value: str, runtime: ToolRuntime) -> str:
    """Save a user preference to long-term storage."""
    store = runtime.store
    store.put(("user_prefs",), key, {"value": value})
    return f"Saved {key}={value}"

store = InMemoryStore()

agent = create_agent(
    model="gpt-4.1",
    tools=[get_user_preference, save_user_preference],
    store=store
)

</python> </ex-store-in-custom-tools>

<boundaries>

What Agents CAN Configure

  • Backend type and configuration
  • Routing rules for CompositeBackend
  • Root directory for FilesystemBackend
  • Human-in-the-loop for file operations

What Agents CANNOT Configure

  • Tool names (ls, read_file, write_file, edit_file, glob, grep)
  • Access files outside virtual_mode restrictions
  • Cross-thread file access without proper backend setup

</boundaries>

<fix-storebackend-requires-store> <python> StoreBackend requires a store instance.

# WRONG
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt))

# CORRECT
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt), store=InMemoryStore())

</python> <typescript> StoreBackend requires a store instance.

// WRONG
const agent = await createDeepAgent({ backend: (c) => new StoreBackend(c) });

// CORRECT
const agent = await createDeepAgent({ backend: (c) => new StoreBackend(c), store: new InMemoryStore() });

</typescript> </fix-storebackend-requires-store>

<fix-statebackend-files-dont-persist> <python> StateBackend files are thread-scoped - use same thread_id or StoreBackend for cross-thread access.

# WRONG: thread-2 can't read file from thread-1
agent.invoke({"messages": [...]}, config={"configurable": {"thread_id": "thread-1"}})  # Write
agent.invoke({"messages": [...]}, config={"configurable": {"thread_id": "thread-2"}})  # File not found!

</python> <typescript> StateBackend files are thread-scoped - use same thread_id or StoreBackend for cross-thread access.

// WRONG: thread-2 can't read file from thread-1
await agent.invoke({ messages: [...] }, { configurable: { thread_id: "thread-1" } });  // Write
await agent.invoke({ messages: [...] }, { configurable: { thread_id: "thread-2" } });  // File not found!

</typescript> </fix-statebackend-files-dont-persist>

<fix-path-prefix-for-persistence> <python> Path must match CompositeBackend route prefix for persistence.

# With routes={"/memories/": StoreBackend(rt)}:
agent.invoke(...)  # /prefs.txt -> ephemeral (no match)
agent.invoke(...)  # /memories/prefs.txt -> persistent (matches route)

</python> <typescript> Path must match CompositeBackend route prefix for persistence.

// With routes: { "/memories/": StoreBackend }:
await agent.invoke(...);  // /prefs.txt -> ephemeral (no match)
await agent.invoke(...);  // /memories/prefs.txt -> persistent (matches route)

</typescript> </fix-path-prefix-for-persistence>

<fix-production-store> <python> Use PostgresStore for production (InMemoryStore lost on restart).

# WRONG                              # CORRECT
store = InMemoryStore()              store = PostgresStore(connection_string="postgresql://...")

</python> <typescript> Use PostgresStore for production (InMemoryStore lost on restart).

// WRONG                                    // CORRECT
const store = new InMemoryStore();          const store = new PostgresStore({ connectionString: "..." });

</typescript> </fix-production-store>

<fix-filesystem-backend-needs-virtual-mode> <python> Enable virtual_mode=True to restrict path access (prevents ../ and ~/ escapes).

backend = FilesystemBackend(root_dir="/project", virtual_mode=True)  # Secure

</python> </fix-filesystem-backend-needs-virtual-mode>

<fix-longest-prefix-match> <python> CompositeBackend matches longest prefix first.

routes = {"/mem/": StoreBackend(rt), "/mem/temp/": StateBackend(rt)}
# /mem/file.txt -> StoreBackend, /mem/temp/file.txt -> StateBackend (longer match)

</python> </fix-longest-prefix-match>

Related skills

Forks & variants (1)

Deep Agents Memory has 1 known copy in the catalog totaling 41 installs. They canonicalize to this original listing.

FAQ

What is the difference between StateBackend and StoreBackend?

StateBackend stores files ephemerally within a thread - lost when thread ends. StoreBackend persists across threads and sessions using a store instance

How do I set up production persistence?

Use PostgresStore instead of InMemoryStore: store = PostgresStore(connectionString='postgresql://...'). InMemoryStore is lost on restart

Is Deep Agents Memory safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

AI & Agent Buildingagentsautomation

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.