ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件

搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件 搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件、调用 APIAgent 不只是调用 LLM还需要执行命令、读写文件、调 API。但让 AI 直接操作你的电脑是有风险的。Agent Harness 就是解决这个问题的——给 Agent 一个受限的沙箱。Harness 做什么Agent 想做什么 → Harness 检查和审批 → 执行 → 返回结果 核心能力 ├─ ️ 沙箱执行限制 Agent 只能操作指定目录 ├─ 命令白名单只允许安全的命令 └─ ✅ 人工审批危险操作需要确认核心代码# harness.pyimportsubprocess,os,shlexfrompathlibimportPathclassAgentHarness:Agent 安全执行环境。ALLOWED_COMMANDS{ls,cat,head,tail,grep,wc,find,echo,date,python,pip,git}def__init__(self,workspace./agent_workspace,require_confirmTrue):self.workspacePath(workspace).resolve()self.workspace.mkdir(parentsTrue,exist_okTrue)self.require_confirmrequire_confirm self.history[]defexecute(self,command:str)-dict:在沙箱中执行命令。cmd_partsshlex.split(command)ifnotcmd_parts:return{error:Empty command}# 安全检查base_cmdcmd_parts[0]ifbase_cmdnotinself.ALLOWED_COMMANDS:return{error:f命令{base_cmd}不在白名单中}# 危险操作需要确认dangerousany(kincommandforkin[rm ,delete,DROP,,])ifdangerousandself.require_confirm:print(f\n⚠️ 危险操作{command})okinput(确认执行[y/N] ).strip().lower()ifok!y:return{error:用户取消}try:resultsubprocess.run(command,shellTrue,capture_outputTrue,textTrue,timeout30,cwdstr(self.workspace),)outputresult.stdout.strip()ifresult.returncode!0:outputresult.stderr.strip()oroutput self.history.append({command:command,output:output[:500]})return{output:output[:2000],code:result.returncode}exceptsubprocess.TimeoutExpired:return{error:命令执行超时30s}exceptExceptionase:return{error:str(e)}defread_file(self,path:str)-dict:安全读取文件。full_path(self.workspace/path).resolve()ifnotstr(full_path).startswith(str(self.workspace)):return{error:不能读取工作目录以外的文件}try:contentfull_path.read_text(encodingutf-8,errorsignore)return{content:content[:5000]}exceptExceptionase:return{error:str(e)}defwrite_file(self,path:str,content:str)-dict:安全写入文件。full_path(self.workspace/path).resolve()ifnotstr(full_path).startswith(str(self.workspace)):return{error:不能写入工作目录以外的文件}ifself.require_confirm:print(f\n 即将写入{path}{len(content)}字符)okinput(确认写入[y/N] ).strip().lower()ifok!y:return{error:用户取消}try:full_path.parent.mkdir(parentsTrue,exist_okTrue)full_path.write_text(content,encodingutf-8)return{status:ok,path:str(full_path.relative_to(self.workspace))}exceptExceptionase:return{error:str(e)}Agent Harness 组合使用# agent_with_harness.pyfromopenaiimportOpenAIfromharnessimportAgentHarnessimportos,jsonfromdotenvimportload_dotenv load_dotenv()clientOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com/v1)harnessAgentHarness(./workspace)TOOLS[{type:function,function:{name:execute_command,description:在沙箱中执行命令。可用命令ls, cat, grep, find, python, git,parameters:{type:object,properties:{command:{type:string}},required:[command]}}},{type:function,function:{name:read_file,description:读取工作目录中的文件,parameters:{type:object,properties:{path:{type:string}},required:[path]}}}]defrun_agent(task):messages[{role:system,content:f你是一个编程助手。工作目录{harness.workspace}}]messages.append({role:user,content:task})whileTrue:respclient.chat.completions.create(modeldeepseek-chat,messagesmessages,toolsTOOLS,tool_choiceauto)msgresp.choices[0].messageifnotmsg.tool_calls:returnmsg.contentfortcinmsg.tool_calls:nametc.function.name argsjson.loads(tc.function.arguments)ifnameexecute_command:resultharness.execute(args[command])elifnameread_file:resultharness.read_file(args[path])else:result{error:Unknown tool}messages.append(msg)messages.append({role:tool,tool_call_id:tc.id,content:json.dumps(result)})# 使用resultrun_agent(在当前目录创建一个 hello.py内容为打印 Hello World然后运行它)print(result)总结一个轻量的 Agent Harness三个核心能力命令白名单限制 Agent 只能执行安全命令目录隔离Agent 只能操作工作目录内的文件危险操作确认删除、覆盖等需要人工审批几十行代码实现让你的 Agent 既强大又安全。本文由 Zyentor智元界原创发布本文发布于 Zyentor智元界 —— AI 开发者社区原文链接https://www.zyentor.com/news/4324
返回列表