关于 deep-agents-memory
deep-agents-memory 说明 Deep Agents 的文件操作与记忆后端配置,适用于需要临时文件、跨会话持久化或本地磁盘访问的 Agent 开发者。可组合不同后端,并按路径将文件路由到不同存储。
主要功能
- 01线程内临时文件存储
- 02跨线程持久化存储
- 03按路径组合后端
- 04文件读写与搜索工具
- 05本地磁盘访问及操作审批
适用场景
- 01在单个线程中保存临时工作文件
- 02让不同线程共享持久记忆
- 03组合临时与长期文件存储
- 04本地开发时限制并审批文件操作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ langchain-ai/ skills-benchmarks --skill deep-agents-memory安装后在 Claude Code 中输入/deep-agents-memory确认已加载。
详细介绍
短期(StateBackend):在单个线程内持久化,线程结束后即丢失 长期(StoreBackend):跨线程和会话持久化 混合(CompositeBackend):将不同路径路由到不同后端
FilesystemMiddleware 提供以下工具:ls、read_file、write_file、edit_file、glob、grep
| Use Case | Backend | Why |
|---|---|---|
| 临时工作文件 | StateBackend | 默认设置,无需配置 |
| 本地开发命令行 | FilesystemBackend | 直接访问磁盘 |
| 跨会话记忆 | StoreBackend | 跨线程持久化 |
| 混合存储 | CompositeBackend | 混合临时存储与持久存储 |
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>
默认的 StateBackend 会在线程内临时存储文件。
```typescript
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
配置 CompositeBackend,将不同路径路由到不同的存储后端。
```python
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>
配置 CompositeBackend,将不同路径路由到不同的存储后端。
```typescript
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)
通过 StoreBackend 路由,/memories/ 中的文件可跨线程持久化。
```python
# 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>
通过 StoreBackend 路由,/memories/ 中的文件可跨线程持久化。
```typescript
// 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
在本地开发中使用 FilesystemBackend,可直接访问真实磁盘并支持人工参与流程。
```python
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>
在本地开发中使用 FilesystemBackend,可直接访问真实磁盘并支持人工参与流程。
```typescript
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()
});
安全提示:切勿在 Web 服务器中使用 FilesystemBackend——请改用 StateBackend 或沙箱。
在自定义工具中直接访问 store,以执行长期记忆操作。 ```python 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>
### Agent 可以配置的内容
- 后端类型和配置
- CompositeBackend 的路由规则
- FilesystemBackend 的根目录
- 文件操作的人工参与流程
### Agent 无法配置的内容
- 工具名称(ls、read_file、write_file、edit_file、glob、grep)
- 访问 virtual_mode 限制范围之外的文件
- 未正确配置后端时的跨线程文件访问
</boundaries>
<fix-storebackend-requires-store>
<python>
StoreBackend 需要一个 store 实例。
```python
# WRONG
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt))
# CORRECT
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt), store=InMemoryStore())
StoreBackend 需要一个 store 实例。
```typescript
// 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 的文件限定在线程内——请使用相同的 thread_id,或使用 StoreBackend 实现跨线程访问。
```python
# 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!
StateBackend 的文件限定在线程内——请使用相同的 thread_id,或使用 StoreBackend 实现跨线程访问。
```typescript
// 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!
```
路径必须匹配 CompositeBackend 的路由前缀,才能实现持久化。
```python
# With routes={"/memories/": StoreBackend(rt)}:
agent.invoke(...) # /prefs.txt -> ephemeral (no match)
agent.invoke(...) # /memories/prefs.txt -> persistent (matches route)
```
路径必须匹配 CompositeBackend 的路由前缀,才能实现持久化。
```typescript
// With routes: { "/memories/": StoreBackend }:
await agent.invoke(...); // /prefs.txt -> ephemeral (no match)
await agent.invoke(...); // /memories/prefs.txt -> persistent (matches route)
```
生产环境请使用 PostgresStore(InMemoryStore 会在重启后丢失)。
```python
# WRONG # CORRECT
store = InMemoryStore() store = PostgresStore(connection_string="postgresql://...")
```
生产环境请使用 PostgresStore(InMemoryStore 会在重启后丢失)。
```typescript
// WRONG // CORRECT
const store = new InMemoryStore(); const store = new PostgresStore({ connectionString: "..." });
```
启用 virtual_mode=True 以限制路径访问(防止通过 ../ 和 ~/ 路径逃逸)。
```python
backend = FilesystemBackend(root_dir="/project", virtual_mode=True) # Secure
```
CompositeBackend 会优先匹配最长前缀。
```python
routes = {"/mem/": StoreBackend(rt), "/mem/temp/": StateBackend(rt)}
# /mem/file.txt -> StoreBackend, /mem/temp/file.txt -> StateBackend (longer match)
```