
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)
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-memoryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 13.8k |
|---|---|
| repo stars | ★ 1.1k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 30, 2026 |
| Repository | langchain-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
<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 Case | Backend | Why |
|---|---|---|
| Temporary working files | StateBackend | Default, no setup |
| Local development CLI | FilesystemBackend | Direct disk access |
| Cross-session memory | StoreBackend | Persists across threads |
| Hybrid storage | CompositeBackend | Mix 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.
- langchain-ai - 41 installs
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.