ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

DeepAgents--02--文件后端(Backend)系统

2026/8/8 20:09:21 拓冰建站 浏览量
DeepAgents--02--文件后端(Backend)系统 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录文件后端Backend系统1、Backend系统概述2、StateBackend (临时状态后端)3、FilesystemBackend (本地磁盘后端)4、LocalShellBackend (本地Shell后端)5、StoreBackend (LangGraph 存储后端)6、CompositeBackend (复合/路由后端)7、自定义后端8、文件后端和checkpointer、store的关系文件后端Backend系统1、Backend系统概述2、StateBackend (临时状态后端)3、FilesystemBackend (本地磁盘后端)# 创建一个临时目录作为Agent的“沙盒”temp_workspace./agent_workspaceos.makedirs(temp_workspace,exist_okTrue)agentcreate_deep_agent(modelllm,tools[web_search],checkpointercheckpointer,backendFilesystemBackend(root_dirtemp_workspace,virtual_modeTrue# 关键防止Agent使用 ../../ 跳出跟目录),system_prompt你是一个助手请根据用户输入的指令进行相应的操作。)4、LocalShellBackend (本地Shell后端)# 创建一个临时目录作为Agent的“沙盒”temp_workspace./agent_workspaceos.makedirs(temp_workspace,exist_okTrue)# 本地沙箱backendLocalShellBackend(root_dirtemp_workspace,virtual_modeTrue,timeout30,# 命令执行超时时间秒max_output_bytes50000,# 命令输出最大字节数# 设置环境变量包含编码相关的配置env{# 获取当前Python解释器的完整路径PATH:f{os.path.dirname(sys.executable)};{os.environ.get(PATH,)},},)agentcreate_deep_agent(modelllm,tools[web_search],checkpointercheckpointer,backendbackend,system_prompt你是一个助手请根据用户输入的指令进行相应的操作。)5、StoreBackend (LangGraph 存储后端)# 案例2-4配置一个具有持久化记忆的Agentfromdeepagents.backendsimportStoreBackendfromdeepagentsimportcreate_deep_agentfromlanggraph.store.memoryimportInMemoryStore agentcreate_deep_agent(modelgpt-4o,backendlambdart:StoreBackend(rt),storeInMemoryStore()# 使用内存存储进程重启后丢失。生产环境可用RedisStore等。)# Agent写入 /memories/ 下的文件在后续的新对话中仍可读取。6、CompositeBackend (复合/路由后端)# 定义复合后端默认用StateBackend但/memories/路径下的操作路由到StoreBackendcomposite_backendlambdart:CompositeBackend(defaultStateBackend(rt),# 默认后端用于临时文件routes{/memories/:StoreBackend(rt),# 持久化路径})agentcreate_deep_agent(modelgpt-4o,backendcomposite_backend,storeInMemoryStore())# 现在Agent对/scratch/plan.md的读写是临时的而对/memories/user_pref.json的读写是持久的。composite_backendlambdart:CompositeBackend(defaultStateBackend(rt),# 默认临时存储routes{/memories/:FilesystemBackend(root_dir/data/agent_memories,virtual_modeTrue),/shared_docs/:FilesystemBackend(root_dir/company/docs,virtual_modeTrue),},)agentcreate_deep_agent(backendcomposite_backend)# 路径解析# /scratch/temp.txt - StateBackend# /memories/2025/note.md - 本地文件 /data/agent_memories/2025/note.md# /shared_docs/api.md - 本地文件 /company/docs/api.md# ls / 命令会聚合来自所有后端的结果。7、自定义后端设计一个极简的“内存字典”后端示例fromdeepagents.backends.protocolimportBackendProtocol,WriteResult,EditResultfromdeepagents.backends.utilsimportFileInfo,GrepMatchfromdatetimeimportdatetimeimportreclassDictBackend(BackendProtocol):一个将文件存储在内存字典中的简单后端。def__init__(self):self.files{}# 路径 - 内容self.metadata{}# 路径 - 元数据大小修改时间defls_info(self,path:str)-list[FileInfo]:# 列出以path为前缀的“文件”和“目录”result[]seen_dirsset()forfile_pathinself.files.keys():iffile_path.startswith(path):# 处理目录项remainingfile_path[len(path):]if/inremaining:dir_namepathremaining.split(/)[0]/ifdir_namenotinseen_dirs:seen_dirs.add(dir_name)result.append(FileInfo(pathdir_name,is_dirTrue))else:# 文件项metaself.metadata.get(file_path,{})result.append(FileInfo(pathfile_path,is_dirFalse,sizemeta.get(size,0),modified_atmeta.get(modified_at)))# result.sort(keylambda x: x.path)returnresultdefread(self,file_path:str,offset:int0,limit:int2000)-str:iffile_pathnotinself.files:returnfError: File {file_path} not foundcontentself.files[file_path]# 简单模拟分页按行处理linescontent.splitlines(keependsTrue)start_lineoffset end_linestart_linelimitiflimit0elselen(lines)selected_lineslines[start_line:end_line]result.join(f{start_linei1}:{line}fori,lineinenumerate(selected_lines))returnresultifresultelse(end of file)defwrite(self,file_path:str,content:str)-WriteResult:iffile_pathinself.files:returnWriteResult(errorfFile {file_path} already exists (create-only).)self.files[file_path]content self.metadata[file_path]{size:len(content),modified_at:datetime.now().isoformat()}# 对于自定义后端files_update 通常为 NonereturnWriteResult(pathfile_path,files_updateNone)# 注意为简洁起见省略了 grep_raw, glob_info, edit 的完整实现。# 一个完整的实现需要填充这些方法。defgrep_raw(self,pattern:str,path:str|NoneNone,glob:str|NoneNone)-list[GrepMatch]|str:# 简化实现仅在全文件搜索try:re.compile(pattern)exceptre.errorase:returnfInvalid regex pattern:{e}matches[]forfile_path,contentinself.files.items():fori,lineinenumerate(content.splitlines()):ifre.search(pattern,line):matches.append(GrepMatch(pathfile_path,linei1,textline))returnmatchesdefglob_info(self,pattern:str,path:str/)-list[FileInfo]:# 简化实现使用 fnmatchimportfnmatch all_files[FileInfo(pathp,is_dirFalse,sizeself.metadata[p][size],modified_atself.metadata[p][modified_at])forpinself.files.keys()ifp.startswith(path)]matched[fiforfiinall_filesiffnmatch.fnmatch(fi.path,path.rstrip(/)/pattern)]returnmatcheddefedit(self,file_path:str,old_string:str,new_string:str,replace_all:boolFalse)-EditResult:iffile_pathnotinself.files:returnEditResult(errorfFile {file_path} not found)contentself.files[file_path]ifreplace_all:new_contentcontent.replace(old_string,new_string)occurrencescontent.count(old_string)else:ifcontent.count(old_string)!1:returnEditResult(errorfFound{content.count(old_string)}occurrences of {old_string}. For safety, edit requires exactly one match unless replace_allTrue.)new_contentcontent.replace(old_string,new_string,1)occurrences1ifnew_contentcontent:returnEditResult(errorfString {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()returnEditResult(pathfile_path,files_updateNone,occurrencesoccurrences)8、文件后端和checkpointer、store的关系