惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园_首页
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
云风的 BLOG
云风的 BLOG
腾讯CDC
V
Visual Studio Blog
宝玉的分享
宝玉的分享
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
H
Help Net Security
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
月光博客
月光博客
T
Threatpost
Recent Announcements
Recent Announcements
G
Google Developers Blog
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
Security Archives - TechRepublic
Security Archives - TechRepublic
Google DeepMind News
Google DeepMind News
Google DeepMind News
Google DeepMind News
V
V2EX
P
Proofpoint News Feed
Y
Y Combinator Blog
The Register - Security
The Register - Security
N
News | PayPal Newsroom
L
Lohrmann on Cybersecurity
H
Hacker News: Front Page
MongoDB | Blog
MongoDB | Blog
量子位
T
Troy Hunt's Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - work hard work smart

使用 LangChain + Hugging Face 构建文本向量化服务 SQLAlchemy 使用详解 Python 中使用 Elasticsearch 的完整指南 Qdrant 向量数据库使用指南 OpenEvals 快速入门:LLM 评估指南 DeepEval 快速入门:LLM 应用评估指南 LangSmith 批量评估完全指南 Qwen-Agent 入门指南:快速构建智能体应用 LangSmith 集成实战:从追踪到评估的完整指南 初识 go-zero:一款让你写后端更规范、更高效的 Go 微服务框架 RAG 中为什么需要 Rerank,以及如何使用 Rerank LangChain4j RAG 核心组件与组合方式 如何使用 Elasticsearch 进行全文检索和向量检索 MinerU Docker 部署指南 5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务 Neo4j 图数据库安装与 Spring Boot 集成实战指南 LangFuse 实战指南:用 @observe 三行代码给 LLM 应用加上全链路追踪 Function Call 深度解析:让大模型从"嘴炮"到"实干"的技术革命 Spring AI 提示词模板实战:告别硬编码,实现提示词工程化管理 LangChain4j 实战指南:用 Java 轻松构建 AI 应用 Spring AI 对话短期记忆实战:让大模型拥有"记忆力" Spring AI 提示词工程实战:让大模型更懂你的意图 Spring AI ChatClient 深度解析:优雅构建大模型应用的利器 Spring AI Alibaba DashScopeChatModel 实战 Spring 中 SSE 流式输出的多种实现方式详解 OpenSandbox 实战指南:为 AI Agent 构建安全的代码执行沙箱 在本机启动 LangGraph 开发服务器:完整指南 为什么选择 Go 开发 Web 接口?从入门到实践 智能搜索DeepAgent笔记 RAG学习笔记2--系统查询流程 RAG学习笔记1--系统文件导入流程 百炼 WebSearch 快速入门指南 Python 连接 MongoDB 完整指南:从连接配置到增删改查实战 一行命令搞定 MongoDB 开发环境:Docker Compose 部署 + 可视化管理 使用 Attu 可视化管理 Milvus 向量数据库 在 Windows Docker 中快速安装 Milvus 2.5.6 minio使用 Spark 集群搭建 hadoop集群安装 Spring AI Alibaba 入门实战 Windows 安装 OpenClaw 实战指南 MyBatis 核心流程和原理 Idea中安装Claude code插件 Spark 编程 使用Matplotlib 绘制直方图 Flink安装部署 Flume安装 查找导致cpu过高的代码方法 JVisualVM监控远程Java进程 jmap jacoco多模块生成java单元测试报告实践 arthas 使用demo LockSupport Exchanger CyclicBarrier CountDownLatch 手把手教你用python开始第一个机器学习项目
DeepAgents中Backend的奥秘:让AI Agent拥有文件操作能力
work hard work smart · 2026-05-24 · via 博客园 - work hard work smart

在构建智能代理(AI Agent)时,我们经常需要让Agent具备读取、写入、搜索和编辑文件的能力。DeepAgents框架通过Backend(后端)机制实现了这一功能,为Agent提供了一个安全、可控的文件操作环境。本文将深入探讨Backend的概念、使用方法,并通过四个渐进式的示例来展示其强大功能。

什么是Backend?

Backend是DeepAgents框架中的一个核心抽象,它定义了Agent如何与文件系统进行交互。通过Backend,Agent可以:

  • 列出文件和目录ls_info
  • 读取文件内容read
  • 写入新文件write
  • 搜索文件内容grep_raw
  • 通配符匹配文件glob_info
  • 编辑现有文件edit

Backend的核心价值在于安全性灵活性:它可以将Agent的文件操作限制在特定目录内,防止越权访问,同时支持多种存储介质(本地文件系统、内存、云存储等)。

Backend的使用场景

  1. 代码生成与编辑:让Agent在沙盒环境中编写和修改代码
  2. 数据分析:Agent读取、处理和生成数据文件
  3. 文档处理:自动化文档创建和内容更新
  4. 配置管理:动态生成和修改配置文件

DeepAgents支持的Backend类型

DeepAgents框架提供了多种Backend实现,满足不同场景的需求:

1. FilesystemBackend - 本地文件系统

  • 功能:直接操作本地磁盘文件
  • 特点:持久化存储,支持virtual_mode安全隔离
  • 适用:需要文件持久化、与其他系统共享文件的场景

2. LocalShellBackend - 本地Shell执行

  • 功能:文件操作 + 本地Shell命令执行
  • 特点:支持运行脚本、调用系统工具(git、docker等)
  • 适用:需要编译代码、运行脚本、执行复杂命令的场景

3. SandboxBackend - 远程沙箱环境

  • 功能:在隔离的沙箱环境中执行命令和操作文件
  • 特点:完全隔离的执行环境,支持云端沙箱(如OpenSandbox、Daytona)
  • 子类实现
    • OpenSandboxBackend:基于OpenSandbox的开源沙箱方案
    • DaytonaBackend:基于Daytona的云沙箱方案
  • 适用:需要高安全性隔离、运行不可信代码、云端执行场景

4. 自定义Backend - 完全灵活

  • 功能:通过实现BackendProtocol接口自定义存储逻辑
  • 特点:可以对接任何存储介质(内存、数据库、云存储等)
  • 示例DictBackend(内存存储)、RedisBackend(Redis存储)等
  • 适用:特殊需求、测试环境、自定义存储逻辑

Backend类型对比

Backend类型 文件操作 命令执行 持久化 安全隔离 典型场景
FilesystemBackend 中等(virtual_mode) 本地文件处理
LocalShellBackend ✅(本地) 中等(virtual_mode) 本地脚本执行
SandboxBackend ✅(沙箱) 可选 高(完全隔离) 云端安全执行
自定义Backend 自定义 自定义 自定义 自定义 特殊需求

四个渐进式示例

示例一:无Backend的基础Agent

最简单的Agent配置不使用Backend,仅依赖工具调用完成任务:

from deepagents import create_deep_agent
from langgraph.checkpoint.memory import InMemorySaver

# 创建内存检查点保存器
checkpointer = InMemorySaver()

# 创建基础Agent
agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    #checkpointer=checkpointer,
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

特点

  • 适合仅需调用外部API(如Web搜索)的场景
  • 无法进行文件操作
  • 配置简单,启动快速

示例二:FilesystemBackend - 文件系统沙盒

当需要Agent操作文件时,FilesystemBackend是最常用的选择:

import os
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend
from langgraph.checkpoint.memory import InMemorySaver

checkpointer = InMemorySaver()

# 创建Agent工作目录
temp_workspace = "./agent_workspace"
os.makedirs(temp_workspace, exist_ok=True)

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=FilesystemBackend(
        root_dir=temp_workspace,
        virtual_mode=True,  # 防止Agent通过`../../`跳出根目录
    ),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

关键参数

  • root_dir:指定Agent的工作根目录
  • virtual_mode=True:启用虚拟模式,防止路径穿越攻击(如../../etc/passwd

适用场景

  • 需要持久化存储文件
  • Agent生成的文件需要在磁盘上保留
  • 需要与其他系统共享文件

示例三:LocalShellBackend - 支持命令执行

如果Agent不仅需要操作文件,还需要执行shell命令,LocalShellBackend是更好的选择:

import os
import sys
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend, LocalShellBackend
from langgraph.checkpoint.memory import InMemorySaver

checkpointer = InMemorySaver()

temp_workspace = "./agent_workspace"
os.makedirs(temp_workspace, exist_ok=True)

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=LocalShellBackend(
        root_dir=temp_workspace,
        virtual_mode=True,
        timeout=30,  # 命令执行超时时间(秒)
        max_output_bytes=50000,  # 命令输出最大字节数
        env={
            "PATH": f"{os.path.dirname(sys.executable)};{os.environ.get('PATH', '')}",
        },
    ),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

新增功能

  • 支持执行shell命令(如python script.pyls -la
  • 可配置超时时间和输出限制,防止恶意或低效命令
  • 自定义环境变量,确保命令在正确的环境中执行

适用场景

  • 需要运行脚本或编译代码
  • 需要调用系统工具(如git、docker)
  • 需要执行复杂的数据处理管道

示例四:自定义Backend - DictBackend

DeepAgents的强大之处在于其可扩展性。通过实现BackendProtocol接口,我们可以创建完全自定义的Backend:

from deepagents.backends.protocol import BackendProtocol, WriteResult, EditResult
from deepagents.backends.utils import FileInfo, GrepMatch
from datetime import datetime
import re

class DictBackend(BackendProtocol):
    """将文件存储在内存字典中的自定义后端"""
    
    def __init__(self):
        self.files = {}  # 路径 -> 内容
        self.metadata = {}  # 路径 -> 元数据
    
    def ls_info(self, path: str) -> list[FileInfo]:
        """列出文件和目录信息"""
        result = []
        seen_dirs = set()
        for file_path in self.files.keys():
            if file_path.startswith(path):
                remaining = file_path[len(path):]
                if '/' in remaining:
                    dir_name = path + remaining.split('/')[0] + '/'
                    if dir_name not in seen_dirs:
                        seen_dirs.add(dir_name)
                        result.append(FileInfo(path=dir_name, is_dir=True))
                else:
                    meta = self.metadata.get(file_path, {})
                    result.append(FileInfo(
                        path=file_path,
                        is_dir=False,
                        size=meta.get('size', 0),
                        modified_at=meta.get('modified_at')
                    ))
        return result
    
    def read(self, file_path: str, offset: int = 0, limit: int = 2000) -> str:
        """读取文件内容,支持分页"""
        if file_path not in self.files:
            return f"Error: File '{file_path}' not found"
        content = self.files[file_path]
        lines = content.splitlines(keepends=True)
        start_line = offset
        end_line = start_line + limit if limit > 0 else len(lines)
        selected_lines = lines[start_line:end_line]
        result = ''.join(f"{start_line + i + 1}: {line}" for i, line in enumerate(selected_lines))
        return result if result else "(end of file)"
    
    def write(self, file_path: str, content: str) -> WriteResult:
        """写入新文件(仅创建,不覆盖)"""
        if file_path in self.files:
            return WriteResult(error=f"File '{file_path}' already exists (create-only).")
        self.files[file_path] = content
        self.metadata[file_path] = {
            'size': len(content),
            'modified_at': datetime.now().isoformat()
        }
        return WriteResult(path=file_path, files_update=None)
    
    def grep_raw(self, pattern: str, path: str | None = None, glob: str | None = None) -> list[GrepMatch] | str:
        """正则表达式搜索文件内容"""
        try:
            re.compile(pattern)
        except re.error as e:
            return f"Invalid regex pattern: {e}"
        matches = []
        for file_path, content in self.files.items():
            for i, line in enumerate(content.splitlines()):
                if re.search(pattern, line):
                    matches.append(GrepMatch(path=file_path, line=i+1, text=line))
        return matches
    
    def glob_info(self, pattern: str, path: str = "/") -> list[FileInfo]:
        """通配符匹配文件"""
        import fnmatch
        all_files = [
            FileInfo(path=p, is_dir=False, size=self.metadata[p]['size'], 
                    modified_at=self.metadata[p]['modified_at']) 
            for p in self.files.keys() if p.startswith(path)
        ]
        matched = [fi for fi in all_files if fnmatch.fnmatch(fi.path, path.rstrip('/') + '/' + pattern)]
        return matched
    
    def edit(self, file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult:
        """编辑文件内容"""
        if file_path not in self.files:
            return EditResult(error=f"File '{file_path}' not found")
        content = self.files[file_path]
        if replace_all:
            new_content = content.replace(old_string, new_string)
            occurrences = content.count(old_string)
        else:
            if content.count(old_string) != 1:
                return EditResult(error=f"Found {content.count(old_string)} occurrences. For safety, edit requires exactly one match unless replace_all=True.")
            new_content = content.replace(old_string, new_string, 1)
            occurrences = 1
        if new_content == content:
            return EditResult(error=f"String '{old_string}' not found.")
        self.files[file_path] = new_content
        self.metadata[file_path]['size'] = len(new_content)
        self.metadata[file_path]['modified_at'] = datetime.now().isoformat()
        return EditResult(path=file_path, files_update=None, occurrences=occurrences)

使用自定义Backend

from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend, LocalShellBackend
from langgraph.checkpoint.memory import InMemorySaver

from my_backend import DictBackend

checkpointer = InMemorySaver()

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=DictBackend(),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

自定义Backend的优势

  • 完全控制:可以定义任何存储逻辑(数据库、云存储、加密存储等)
  • 安全隔离:Agent操作完全在内存中,不影响真实文件系统
  • 可测试性:便于单元测试和调试
  • 性能优化:针对特定场景优化读写性能

Backend的选择指南

场景 推荐Backend 原因
仅需API调用,无需文件操作 无Backend 简单高效
需要持久化文件存储 FilesystemBackend 直接操作磁盘文件
需要执行shell命令 LocalShellBackend 支持命令执行+文件操作
需要完全隔离或自定义存储 自定义Backend 灵活可控,适合特殊需求

最佳实践

  1. 始终启用virtual_mode:防止路径穿越攻击,确保Agent在沙盒内操作
  2. 设置合理的超时和限制:避免恶意或低效命令消耗过多资源
  3. 使用checkpointer保存状态:支持对话历史恢复和断点续传
  4. 自定义Backend时实现完整接口:确保所有方法都正确实现,避免运行时错误
  5. 记录Backend操作日志:便于调试和审计Agent行为

总结

Backend是DeepAgents框架中连接AI Agent与文件系统的桥梁。通过灵活选择或自定义Backend,我们可以为Agent打造安全、高效、可控的文件操作环境。从简单的无Backend配置,到功能强大的LocalShellBackend,再到完全自定义的DictBackend,DeepAgents提供了丰富的选项来满足各种应用场景。

掌握Backend的使用,将帮助你构建更加强大和实用的AI Agent,让智能代理真正具备"动手"能力!