当前位置: 首页 > news >正文

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

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

Agent 不只是调用 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_confirm=True):self.workspace=Path(workspace).resolve()self.workspace.mkdir(parents=True,exist_ok=True)self.require_confirm=require_confirm self.history=[]defexecute(self,command:str)->dict:"""在沙箱中执行命令。"""cmd_parts=shlex.split(command)ifnotcmd_parts:return{"error":"Empty command"}# 安全检查base_cmd=cmd_parts[0]ifbase_cmdnotinself.ALLOWED_COMMANDS:return{"error":f"命令{base_cmd}不在白名单中"}# 危险操作需要确认dangerous=any(kincommandforkin["rm ","delete","DROP",">",">>"])ifdangerousandself.require_confirm:print(f"\n⚠️ 危险操作:{command}")ok=input("确认执行?[y/N] ").strip().lower()ifok!="y":return{"error":"用户取消"}try:result=subprocess.run(command,shell=True,capture_output=True,text=True,timeout=30,cwd=str(self.workspace),)output=result.stdout.strip()ifresult.returncode!=0:output=result.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:content=full_path.read_text(encoding="utf-8",errors="ignore")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)}字符)")ok=input("确认写入?[y/N] ").strip().lower()ifok!="y":return{"error":"用户取消"}try:full_path.parent.mkdir(parents=True,exist_ok=True)full_path.write_text(content,encoding="utf-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()client=OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),base_url="https://api.deepseek.com/v1")harness=AgentHarness("./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:resp=client.chat.completions.create(model="deepseek-chat",messages=messages,tools=TOOLS,tool_choice="auto")msg=resp.choices[0].messageifnotmsg.tool_calls:returnmsg.contentfortcinmsg.tool_calls:name=tc.function.name args=json.loads(tc.function.arguments)ifname=="execute_command":result=harness.execute(args["command"])elifname=="read_file":result=harness.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)})# 使用result=run_agent("在当前目录创建一个 hello.py,内容为打印 Hello World,然后运行它")print(result)

总结

一个轻量的 Agent Harness,三个核心能力:

  1. 命令白名单:限制 Agent 只能执行安全命令
  2. 目录隔离:Agent 只能操作工作目录内的文件
  3. 危险操作确认:删除、覆盖等需要人工审批

几十行代码实现,让你的 Agent 既强大又安全。

本文由 Zyentor(智元界)原创发布


本文发布于 Zyentor(智元界) —— AI 开发者社区
原文链接:https://www.zyentor.com/news/4324

http://www.gsyq.cn/news/1626187.html

相关文章:

  • ChatGPT角色设定提示词工程(企业级SOP已验证):92%用户忽略的3层语义锚定技术
  • PHP WebSocket端到端加密实战:从ECDH密钥交换到AES-GCM消息保护
  • 如何用免费工具FanControl快速解决Windows电脑风扇噪音与散热问题?
  • 用了 SiC、GaN,为什么仿真越跑越不敢信?
  • 性价比高的百年药企选哪家
  • 【新手上路】多目标优化问题
  • 中小企业知识产权布局:商标、专利、版权零基础科
  • DLSS Swapper终极指南:一键智能切换DLSS版本,轻松提升游戏帧率
  • AppleRa1n:iOS 15-16激活锁绕过完整指南,5分钟快速解锁你的iPhone
  • Biotinyl-Pancreatic Polypeptide (human)
  • ChatGPT提示词编写进阶指南(从“能用”到“稳赢”的5层能力跃迁)
  • 2026破圈!5款一键生成论文工具实测,专治选择困难,初稿框架5分钟搭好!
  • HunterPie终极指南:打造《怪物猎人世界》最强游戏覆盖层工具
  • AI Agent 中 Hook 机制技术
  • 提示词响应率暴跌?立即排查这4个隐性陷阱,87%用户至今未察觉
  • ChatGPT提示词效能跃迁:从模糊指令到精准角色驱动的5步结构化方法论
  • 影刀RPA新手教程:飞书审批流自动发起完全指南——表单填写、附件上传与审批状态追踪
  • 降重降AI工具横向测评:如何选择靠谱的AIGC降重平台?
  • 软考单科成绩保留年限深度溯源(依据人社部函〔2023〕87号+近5年全国12省市实证数据)
  • 3分钟学会微博备份:Speechless一键导出PDF完整指南
  • 为什么主板显卡搭配会影响整机性能
  • D2DX现代化补丁:3大核心功能彻底解决暗黑破坏神2老游戏卡顿与画面问题
  • FanControl终极指南:5个实战场景解决Windows风扇控制难题
  • 科普|明明是32位总线!为什么MCU GPIO固执用8bit分组?误区、成本、工程取舍全讲透
  • 如何3步配置XUnity.AutoTranslator:实现Unity游戏自动本地化的终极指南
  • 氩离子抛光技术在石油地质的应用
  • 英雄联盟玩家的效率革命:5分钟掌握League Akari完全指南
  • 158、 PCIE Windows驱动开发:从蓝屏到稳定
  • League Akari:终极英雄联盟自动化工具箱完全指南
  • Discord机器人开发实战:从架构设计到性能优化