专为 Anthropic Claude 模型设计的中间件。了解更多关于 中间件.
| 中间件 | 描述 |
|---|---|
| 提示缓存 | 通过缓存重复的提示前缀来降低成本 |
| Bash 工具 | 使用本地命令执行功能执行 Claude 原生 Bash 工具 |
| 文本编辑器 | 提供 Claude 的文本编辑器工具用于文件编辑 |
| 内存 | 提供 Claude 的内存工具用于持久化代理内存 |
| 文件搜索 | 用于基于状态文件系统的搜索工具 |
中间件与工具
langchain-anthropic 提供两种使用 Claude 原生工具的方式:
- 中间件 (本页面):生产就绪的实现,包含内置执行、状态管理和安全策略
- 工具 (通过
bind_tools):低级别构建块,您需要提供自己的执行逻辑
何时使用哪种
| 使用场景 | 推荐 | 原因 |
|---|---|---|
| 使用 bash 的生产环境代理 | 中间件 | 持久会话、Docker 隔离、输出编辑 |
| 基于状态的文件编辑 | 中间件 | 内置 LangGraph 状态持久化 |
| 文件系统文件编辑 | 中间件 | 写入磁盘并验证路径 |
| 自定义执行逻辑 | 工具 | 完全控制执行 |
| 快速原型 | 工具 | 更简单,需要自己实现回调 |
非代理使用 bind_tools | 工具 | 中间件需要 create_agent |
功能对比
| 功能 | 中间件 | 工具 |
|---|---|---|
与 create_agent | ✅ | ✅ |
与 bind_tools | ❌ | ✅ |
| 内置状态管理 | ✅ | ❌ |
| 自定义执行回调 | ❌ | ✅ |
Example: Middleware vs tools comparison
使用中间件 (交钥匙解决方案):
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import ClaudeBashToolMiddleware
from langchain.agents import create_agent
from langchain.agents.middleware import DockerExecutionPolicy
# Production-ready with Docker isolation, session management, etc.
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
middleware=[
ClaudeBashToolMiddleware(
workspace_root="/workspace",
execution_policy=DockerExecutionPolicy(image="python:3.11"),
startup_commands=["pip install pandas"],
),
],
)
使用工具 (提供自己的执行逻辑):
from anthropic.types.beta import BetaToolBash20250124Param
from langchain_anthropic import ChatAnthropic
from langchain.agents import create_agent
from langchain.tools import tool
tool_spec = BetaToolBash20250124Param(
name="bash",
type="bash_20250124",
strict=True,
)
@tool(extras={"provider_tool_definition": tool_spec})
def bash(*, command: str, restart: bool = False, **kw):
"""Execute a bash command."""
if restart:
return "Bash session restarted"
try:
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
timeout=30,
)
return result.stdout + result.stderr
except Exception as e:
return f"Error: {e}"
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[bash],
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "List files in this directory"}]}
)
print(result["messages"][-1].content)
提示缓存
通过在 Anthropic 服务器上缓存静态或重复的提示内容(如系统提示、工具定义和对话历史)来降低成本和延迟。此中间件实现了一种 **对话缓存策略** 直接标记稳定的代理内容(如系统提示和工具定义),并传递 cache_control 通过 model_settings聊天模型和提供商随后处理消息尾部和特定提供商的缓存行为,允许对话历史被缓存并在后续 API 调用中重用。
提示词缓存适用于以下场景:
- - 具有长静态系统提示的应用程序,这些提示在请求之间不会改变
- - 具有多个工具定义且这些定义在调用过程中保持不变的智能体
- - 早期消息历史在多个轮次中被重用的对话
- - 高流量部署,降低 API 成本和延迟至关重要
API 参考: AnthropicPromptCachingMiddleware
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
system_prompt="",
middleware=[AnthropicPromptCachingMiddleware(ttl="5m")], # [!code highlight]
)
Configuration options
缓存类型。目前仅支持 'ephemeral' 。
缓存内容的生存时间。有效值: '5m' or '1h'
开始缓存前的最小消息数
使用非 Anthropic 模型时的行为。选项: 'ignore', 'warn', or 'raise'
Full example
中间件缓存每个请求中直到最新消息的内容。在 TTL 窗口(5 分钟或 1 小时)内的后续请求中,之前看到的内容从缓存中检索,而不是重新处理,从而显著降低成本和延迟。
工作原理: 1. 第一个请求:系统提示、工具和用户消息 *「嗨,我叫鲍勃」* 被发送到 API 并缓存 2. 第二个请求:缓存的内容(系统提示、工具和第一条消息)从缓存中检索。只有新消息 *「我叫什么名字?」* 需要处理,加上第一次请求中模型的响应 3. 每个轮次都继续这种模式,每个请求都重用缓存的对话历史
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
LONG_PROMPT = """
Please be a helpful assistant.
"""
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
system_prompt=LONG_PROMPT,
middleware=[AnthropicPromptCachingMiddleware(ttl="5m")], # [!code highlight]
checkpointer=MemorySaver(), # Persists conversation history
)
# Use a thread_id to maintain conversation state
config: RunnableConfig = {"configurable": {"thread_id": "user-123"}}
# First invocation: Creates cache with system prompt, tools, and "Hi, my name is Bob"
agent.invoke({"messages": [HumanMessage("Hi, my name is Bob")]}, config=config)
# Second invocation: Reuses cached system prompt, tools, and previous messages
# The checkpointer maintains conversation history, so the agent remembers "Bob"
result = agent.invoke({"messages": [HumanMessage("What's my name?")]}, config=config)
print(result["messages"][-1].content)
Your name is Bob! You told me that when you introduced yourself at the start of our conversation.
Bash 工具
执行 Claude 的原生 bash_20250124 工具进行本地命令执行。
Bash 工具中间件适用于以下场景:
- - 使用 Claude 内置的 bash 工具进行本地执行
- - 利用 Claude 优化的 bash 工具界面
- - 需要与 Anthropic 模型保持持久 shell 会话的智能体
API 参考: ClaudeBashToolMiddleware
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import ClaudeBashToolMiddleware
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[ # [!code highlight]
ClaudeBashToolMiddleware( # [!code highlight]
workspace_root="/workspace", # [!code highlight]
), # [!code highlight]
], # [!code highlight]
)
Configuration options
ClaudeBashToolMiddleware 接受来自 ShellToolMiddleware 的所有参数,包括:
Shell 会话的基目录
会话启动时运行的命令
执行策略(HostExecutionPolicy, DockerExecutionPolicy, or CodexSandboxExecutionPolicy)
命令输出的清理规则
参见 Shell 工具 获取完整的配置详情。
Full example
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import ClaudeBashToolMiddleware
from langchain.agents import create_agent
from langchain.agents.middleware import DockerExecutionPolicy
# Create a temporary workspace directory for this demo.
# In production, use a persistent directory path.
workspace = tempfile.mkdtemp(prefix="agent-workspace-")
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[ # [!code highlight]
ClaudeBashToolMiddleware( # [!code highlight]
workspace_root=workspace, # [!code highlight]
startup_commands=["echo 'Session initialized'"], # [!code highlight]
execution_policy=DockerExecutionPolicy( # [!code highlight]
image="python:3.11-slim", # [!code highlight]
), # [!code highlight]
), # [!code highlight]
], # [!code highlight]
)
# Claude can now use its native bash tool
result = agent.invoke(
{"messages": [{"role": "user", "content": "What version of Python is installed?"}]}
)
print(result["messages"][-1].content)
Python 3.11.14 is installed.
文本编辑器
提供 Claude 的文本编辑器工具(text_editor_20250728)用于文件的创建和编辑。
文本编辑器中间件适用于以下场景:
- - 基于文件的智能体工作流
- - 代码编辑和重构任务
- - 多文件项目工作
- - 需要持久文件存储的智能体
API 参考: - StateClaudeTextEditorMiddleware - FilesystemClaudeTextEditorMiddleware
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import StateClaudeTextEditorMiddleware
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[StateClaudeTextEditorMiddleware()], # [!code highlight]
)
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import FilesystemClaudeTextEditorMiddleware
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[ # [!code highlight]
FilesystemClaudeTextEditorMiddleware( # [!code highlight]
root_path="/workspace", # [!code highlight]
), # [!code highlight]
], # [!code highlight]
)
Claude 的文本编辑器工具支持以下命令:
- -
view- 查看文件内容或列出目录 - -
create- 创建新文件 - -
str_replace- 替换文件中的字符串 - -
insert- 在指定行号插入文本 - -
delete- 删除文件 - -
rename- Rename/move a file
Configuration options
**@[StateClaudeTextEditorMiddleware(基于状态)**
可选的允许路径前缀列表。如果指定,则仅允许以这些前缀开头的路径。
**@[FilesystemClaudeTextEditorMiddleware(基于文件系统)**
文件操作的根目录
可选的允许虚拟路径前缀列表(默认: ["/"])
最大文件大小(MB)
Full example: State-based text editor
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import StateClaudeTextEditorMiddleware
from langchain.agents import create_agent
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[
StateClaudeTextEditorMiddleware( # [!code highlight]
allowed_path_prefixes=["/project"], # [!code highlight]
), # [!code highlight]
],
checkpointer=MemorySaver(),
)
# Use a thread_id to persist state across invocations
config: RunnableConfig = {"configurable": {"thread_id": "my-session"}}
# Claude can now create and edit files (stored in LangGraph state)
result = agent.invoke(
{"messages": [{"role": "user", "content": "Create a file at /project/hello.py with a simple hello world program"}]},
config=config,
)
print(result["messages"][-1].content)
I've created a simple "Hello, World!" program at `/project/hello.py`. The program uses Python's `print()` function to display "Hello, World!" to the console when executed.
Full example: Filesystem-based text editor
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import FilesystemClaudeTextEditorMiddleware
from langchain.agents import create_agent
# Create a temporary workspace directory for this demo.
# In production, use a persistent directory path.
workspace = tempfile.mkdtemp(prefix="editor-workspace-")
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[
FilesystemClaudeTextEditorMiddleware( # [!code highlight]
root_path=workspace, # [!code highlight]
allowed_prefixes=["/src"], # [!code highlight]
max_file_size_mb=10, # [!code highlight]
), # [!code highlight]
],
)
# Claude can now create and edit files (stored on disk)
result = agent.invoke(
{"messages": [{"role": "user", "content": "Create a file at /src/hello.py with a simple hello world program"}]}
)
print(result["messages"][-1].content)
I've created a simple "Hello, World!" program at `/src/hello.py`. The program uses Python's `print()` function to display "Hello, World!" to the console when executed.
记忆
提供 Claude 的记忆工具(memory_20250818)用于在对话轮次之间保持智能体记忆。
记忆中间件适用于以下场景:
- - 长时间运行的智能体对话
- - 在中断期间保持上下文
- - 任务进度跟踪
- - 持久化智能体状态管理
API 参考: StateClaudeMemoryMiddleware, FilesystemClaudeMemoryMiddleware
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import StateClaudeMemoryMiddleware
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[StateClaudeMemoryMiddleware()], # [!code highlight]
)
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import FilesystemClaudeMemoryMiddleware
from langchain.agents import create_agent
agent_fs = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[ # [!code highlight]
FilesystemClaudeMemoryMiddleware( # [!code highlight]
root_path="/workspace", # [!code highlight]
), # [!code highlight]
], # [!code highlight]
)
Configuration options
**@[StateClaudeMemoryMiddleware(基于状态)**
可选的允许路径前缀列表。默认为 ["/memories"].
要注入的系统提示词。默认为 Anthropic 推荐的记忆提示词,鼓励智能体检查和更新记忆。
**@[FilesystemClaudeMemoryMiddleware(基于文件系统)**
文件操作的根目录
可选的允许虚拟路径前缀列表。默认为 ["/memories"].
最大文件大小(MB)
要注入的系统提示词
Full example: State-based memory
智能体将自动: 1. 检查 /memories 会话开始时的目录 2. 在执行过程中记录进度和想法 3. 随着工作进展更新记忆文件
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import StateClaudeMemoryMiddleware
from langchain.agents import create_agent
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[StateClaudeMemoryMiddleware()], # [!code highlight]
checkpointer=MemorySaver(),
)
# Use a thread_id to persist state across invocations
config: RunnableConfig = {"configurable": {"thread_id": "my-session"}}
# Claude can now use memory to track progress (stored in LangGraph state)
result = agent.invoke(
{"messages": [{"role": "user", "content": "Remember that my favorite color is blue, then confirm what you stored."}]},
config=config,
)
print(result["messages"][-1].content)
Perfect! I've stored your favorite color as **blue** in my memory system. The information is saved in my user preferences file where I can access it in future conversations.
Full example: Filesystem-based memory
代理将自动: 1. 检查 /memories 启动时检查目录 2. 在执行过程中记录进度和想法 3. 随着工作进展更新记忆文件
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import FilesystemClaudeMemoryMiddleware
from langchain.agents import create_agent
# Create a temporary workspace directory for this demo.
# In production, use a persistent directory path.
workspace = tempfile.mkdtemp(prefix="memory-workspace-")
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[
FilesystemClaudeMemoryMiddleware( # [!code highlight]
root_path=workspace, # [!code highlight]
), # [!code highlight]
],
)
# Claude can now use memory to track progress (stored on disk)
result = agent.invoke(
{"messages": [{"role": "user", "content": "Remember that my favorite color is blue, then confirm what you stored."}]}
)
print(result["messages"][-1].content)
Perfect! I've stored your favorite color as **blue** in my memory system. The information is saved in my user preferences file where I can access it in future conversations.
文件搜索
为存储在 LangGraph 状态中的文件提供 Glob 和 Grep 搜索工具。文件搜索中间件适用于以下场景:
- - 搜索基于状态的虚拟文件系统
- - 与文本编辑器和记忆工具配合使用
- - 按模式查找文件
- - 使用正则表达式进行内容搜索
API 参考: StateFileSearchMiddleware
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import (
StateClaudeTextEditorMiddleware,
StateFileSearchMiddleware,
)
from langchain.agents import create_agent
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[ # [!code highlight]
StateClaudeTextEditorMiddleware(), # [!code highlight]
StateFileSearchMiddleware(), # Search text editor files [!code highlight]
], # [!code highlight]
)
Configuration options
包含要搜索文件的状态键。使用 "text_editor_files" 用于文本编辑器文件,或 "memory_files" 用于记忆文件。
Full example: Search text editor files
中间件添加了可处理基于状态文件的 Glob 和 Grep 搜索工具。
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import (
StateClaudeTextEditorMiddleware,
StateFileSearchMiddleware,
)
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[
StateClaudeTextEditorMiddleware(),
StateFileSearchMiddleware(state_key="text_editor_files"), # [!code highlight]
],
checkpointer=MemorySaver(),
)
# Use a thread_id to persist state across invocations
config: RunnableConfig = {"configurable": {"thread_id": "my-session"}}
# First invocation: Create some files using the text editor tool
result = agent.invoke(
{"messages": [HumanMessage("Create a Python project with main.py, utils/helpers.py, and tests/test_main.py")]},
config=config,
)
# The agent creates files, which are stored in state
print("Files created:", list(result["text_editor_files"].keys()))
# Second invocation: Search the files we just created
# State is automatically persisted via the checkpointer
result = agent.invoke(
{"messages": [HumanMessage("Find all Python files in the project")]},
config=config,
)
print(result["messages"][-1].content)
Files created: ['/project/main.py', '/project/utils/helpers.py', '/project/utils/__init__.py', '/project/tests/test_main.py', '/project/tests/__init__.py', '/project/README.md']
I found 5 Python files in the project:
1. `/project/main.py` - Main application file
2. `/project/utils/__init__.py` - Utils package initialization
3. `/project/utils/helpers.py` - Helper utilities
4. `/project/tests/__init__.py` - Tests package initialization
5. `/project/tests/test_main.py` - Main test file
Would you like me to view the contents of any of these files?
Full example: Search memory files
from langchain_anthropic import ChatAnthropic
from langchain_anthropic.middleware import (
StateClaudeMemoryMiddleware,
StateFileSearchMiddleware,
)
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-6"),
tools=[],
middleware=[
StateClaudeMemoryMiddleware(),
StateFileSearchMiddleware(state_key="memory_files"), # [!code highlight]
],
checkpointer=MemorySaver(),
)
# Use a thread_id to persist state across invocations
config: RunnableConfig = {"configurable": {"thread_id": "my-session"}}
# First invocation: Record some memories
result = agent.invoke(
{"messages": [HumanMessage("Remember that the project deadline is March 15th and code review deadline is March 10th")]},
config=config,
)
# The agent creates memory files, which are stored in state
print("Memory files created:", list(result["memory_files"].keys()))
# Second invocation: Search the memories we just recorded
# State is automatically persisted via the checkpointer
result = agent.invoke(
{"messages": [HumanMessage("Search my memories for project deadlines")]},
config=config,
)
print(result["messages"][-1].content)
Memory files created: ['/memories/project_info.md']
I found your project deadlines in my memory! Here's what I have recorded:
## Important Deadlines
- **Code Review Deadline:** March 10th
- **Project Deadline:** March 15th
## Notes
- Code review must be completed 5 days before final project deadline
- Need to ensure all code is ready for review by March 10th
Is there anything specific about these deadlines you'd like to know or update?