一键解决Windows软件运行难题:Visual C++运行库全自动安装方案
2026/8/8 20:54:29
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
# 创建一个临时目录作为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='你是一个助手,请根据用户输入的指令,进行相应的操作。')# 创建一个临时目录作为Agent的“沙盒”temp_workspace="./agent_workspace"os.makedirs(temp_workspace,exist_ok=True)# 本地沙箱backend=LocalShellBackend(root_dir=temp_workspace,virtual_mode=True,timeout=30,# 命令执行超时时间(秒)max_output_bytes=50000,# 命令输出最大字节数# 设置环境变量,包含编码相关的配置env={# 获取当前Python解释器的完整路径"PATH":f"{os.path.dirname(sys.executable)};{os.environ.get('PATH','')}",},)agent=create_deep_agent(model=llm,tools=[web_search],checkpointer=checkpointer,backend=backend,system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。')# 案例2-4:配置一个具有持久化记忆的Agentfromdeepagents.backendsimportStoreBackendfromdeepagentsimportcreate_deep_agentfromlanggraph.store.memoryimportInMemoryStore agent=create_deep_agent(model="gpt-4o",backend=lambdart:StoreBackend(rt),store=InMemoryStore()# 使用内存存储,进程重启后丢失。生产环境可用RedisStore等。)# Agent写入 /memories/ 下的文件,在后续的新对话中仍可读取。# 定义复合后端:默认用StateBackend,但`/memories/`路径下的操作路由到StoreBackendcomposite_backend=lambdart:CompositeBackend(default=StateBackend(rt),# 默认后端,用于临时文件routes={"/memories/":StoreBackend(rt),# 持久化路径})agent=create_deep_agent(model="gpt-4o",backend=composite_backend,store=InMemoryStore())# 现在,Agent对`/scratch/plan.md`的读写是临时的,而对`/memories/user_pref.json`的读写是持久的。composite_backend=lambdart:CompositeBackend(default=StateBackend(rt),# 默认临时存储routes={"/memories/":FilesystemBackend(root_dir="/data/agent_memories",virtual_mode=True),"/shared_docs/":FilesystemBackend(root_dir="/company/docs",virtual_mode=True),},)agent=create_deep_agent(backend=composite_backend)# 路径解析:# `/scratch/temp.txt` -> StateBackend# `/memories/2025/note.md` -> 本地文件 `/data/agent_memories/2025/note.md`# `/shared_docs/api.md` -> 本地文件 `/company/docs/api.md`# `ls /` 命令会聚合来自所有后端的结果。
设计一个极简的“内存字典”后端示例:
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_dirs=set()forfile_pathinself.files.keys():iffile_path.startswith(path):# 处理目录项remaining=file_path[len(path):]if'/'inremaining:dir_name=path+remaining.split('/')[0]+'/'ifdir_namenotinseen_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')))# result.sort(key=lambda x: x.path)returnresultdefread(self,file_path:str,offset:int=0,limit:int=2000)->str:iffile_pathnotinself.files:returnf"Error: File '{file_path}' not found"content=self.files[file_path]# 简单模拟分页:按行处理lines=content.splitlines(keepends=True)start_line=offset end_line=start_line+limitiflimit>0elselen(lines)selected_lines=lines[start_line:end_line]result=''.join(f"{start_line+i+1}:{line}"fori,lineinenumerate(selected_lines))returnresultifresultelse"(end of file)"defwrite(self,file_path:str,content:str)->WriteResult:iffile_pathinself.files:returnWriteResult(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()}# 对于自定义后端,files_update 通常为 NonereturnWriteResult(path=file_path,files_update=None)# 注意:为简洁起见,省略了 grep_raw, glob_info, edit 的完整实现。# 一个完整的实现需要填充这些方法。defgrep_raw(self,pattern:str,path:str|None=None,glob:str|None=None)->list[GrepMatch]|str:# 简化实现:仅在全文件搜索try:re.compile(pattern)exceptre.errorase:returnf"Invalid regex pattern:{e}"matches=[]forfile_path,contentinself.files.items():fori,lineinenumerate(content.splitlines()):ifre.search(pattern,line):matches.append(GrepMatch(path=file_path,line=i+1,text=line))returnmatchesdefglob_info(self,pattern:str,path:str="/")->list[FileInfo]:# 简化实现:使用 fnmatchimportfnmatch all_files=[FileInfo(path=p,is_dir=False,size=self.metadata[p]['size'],modified_at=self.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:bool=False)->EditResult:iffile_pathnotinself.files:returnEditResult(error=f"File '{file_path}' not found")content=self.files[file_path]ifreplace_all:new_content=content.replace(old_string,new_string)occurrences=content.count(old_string)else:ifcontent.count(old_string)!=1:returnEditResult(error=f"Found{content.count(old_string)}occurrences of '{old_string}'. For safety, edit requires exactly one match unless replace_all=True.")new_content=content.replace(old_string,new_string,1)occurrences=1ifnew_content==content:returnEditResult(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()returnEditResult(path=file_path,files_update=None,occurrences=occurrences)