












构建智能代理(AI Agent)时,吾辈常需使Agent具读、写、索、辑之能。DeepAgents框架藉Backend(后端)之制,成此功能,为Agent设一安且可控之文操作境。是文将深究Backend之理、用法,并历四渐之例,以彰其伟力。
Backend乃DeepAgents框架之枢要抽象,其定Agent与文系统相交之法。由Backend,Agent可:
ls_info)read)write)grep_raw)glob_info)edit)Backend之要,在于安泰与变通:此可限Agent之文件操作于特定目录,防越权而入,复支多种存储介质(本地文件系统、内存、云存储等)。
DeepAgents之框架,备诸般Backend之实现,应不同之境遇:
OpenSandboxBackend:基于OpenSandbox之开源沙箱方案DaytonaBackend:基于Daytona之云沙箱方案BackendProtocol接以自定存贮之理DictBackend(内存存)、RedisBackend(Redis存)等| 后端之类型 | 文件之操持 | 命行令施 | 永续之存 | 安隔离绝 | 典型之境 |
|---|---|---|---|---|---|
| 文件系统后端 | ✅ | ❌ | ✅ | 中庸之境(virtual_mode) | 本地文件之理 |
| 本地壳后端 | ✔ | ✅(本地) | ✅ | 中(虚拟模式) | 本地脚本执行 |
| SandboxBackend | ✅ | ✅(沙箱) | 可选 | 高(完全隔离) | 云端安全执行 |
| 自定义Backend | 自定义 | 自定义 | 自定义 | 自定义 | 特殊需求 |
至简之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='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)
特性:
若需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非惟操作文件,亦需执行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='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)
新增之功能:
python script.py、ls -la),适用之境:
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之利:
| 场景 | 推 Backend | 由 |
|---|---|---|
| 仅需 API 调用,无需文件操作 | 无 Backend | 简而高效 |
| 需持久化文件存储 | FilesystemBackend | 直操磁盘文件 |
| 需执行 shell 命令 | LocalShellBackend | 支命令执行+文件操作 |
| 需完全隔离或自定存储 | 自定Backend | 权变可控,宜于殊需 |
Backend者,DeepAgents框架之橋也,連AI Agent與文件系統。選擇或自定Backend,可為Agent營造安全、高效、可控之文件操作境。自簡單無Backend之配置,至功能強大之LocalShellBackend,復至完全自定之DictBackend,DeepAgents供豐富選項,以應萬般應用之場。
善用Backend,將助君構築更強大、更實用之AI Agent,使智能代理得具「動手」之能!
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。