Agent 可靠性工程实战(二):把工具调用从“模型想做”变成“宿主允许做”
本篇直接复用上一篇的Ledger.append()、load_events()与runs/demo-001/events.jsonl。上一篇最后一条model_proposed事件就是本篇授权器的输入本篇新增tools.json和policy.py输出tool_allowed或tool_denied事件。模型只描述意图真正的文件路径解析与权限判断由宿主完成。一、工具声明不是权限把read_file的 JSON Schema 发给模型只代表模型知道怎样构造参数不代表它获得了读取任意文件的能力。如果宿主直接执行模型给出的路径../../.ssh/id_rsa、符号链接和绝对路径都可能越出工作区。安全边界必须位于模型无法修改的确定性代码里。tools.json用数据描述每个工具的操作类别、允许根目录和单次输出上限。策略默认拒绝名称不存在、参数缺失、路径越界或操作类别不匹配都会产生明确原因码。原因码比自然语言稳定后续统计和回放不会因翻译变化而失效。{schema_version:1,tools:{read_file:{operation:read,roots:[workspace/src,workspace/tests],max_bytes:65536},run_tests:{operation:execute,commands:[[python,-m,unittest]]}}}运行输出loaded_tools2 schema_version1下面的路径判断先做词法拒绝再解析真实路径最后用relative_to验证所属关系。只用字符串前缀会把/work/app-copy误判成/work/app的子目录只删除..又挡不住指向外部的符号链接。from__future__importannotationsimportjsonfromdataclassesimportdataclassfrompathlibimportPathfromtypingimportAnyfromledgerimportLedger,load_eventsdataclass(frozenTrue)classDecision:allowed:boolreason:strnormalized:dict[str,Any]definside(path:Path,root:Path)-bool:try:path.relative_to(root)returnTrueexceptValueError:returnFalsedefauthorize(call:dict[str,Any],manifest:dict,project:Path)-Decision:specmanifest[tools].get(call.get(tool))ifspecisNone:returnDecision(False,unknown_tool,{})ifspec[operation]read:rawcall.get(path)ifnotisinstance(raw,str)orPath(raw).is_absolute():returnDecision(False,invalid_path,{})candidate(project/raw).resolve()roots[(project/root).resolve()forrootinspec[roots]]ifnotany(inside(candidate,root)forrootinroots):returnDecision(False,outside_roots,{path:str(candidate)})returnDecision(True,allowed,{path:str(candidate),max_bytes:spec[max_bytes]})returnDecision(False,unsupported_operation,{})defmain()-int:events_pathPath(runs/demo-001/events.jsonl)proposedload_events(events_path)[-1][payload]manifestjson.loads(Path(tools.json).read_text(encodingutf-8))decisionauthorize(proposed,manifest,Path.cwd())Ledger(events_path,demo-001).append(tool_allowedifdecision.allowedelsetool_denied,{reason:decision.reason,**decision.normalized},)print(fallowed{decision.allowed}reason{decision.reason})return0if__name____main__:raiseSystemExit(main())运行输出allowedTrue reasonallowed二、为什么规范化必须发生在执行前权限判断若针对原始字符串执行时再解析路径两阶段看到的可能不是同一个对象。攻击者可以让符号链接在判断后指向另一个位置这叫检查与使用之间的竞态。对高风险写操作仅靠resolve()仍不够需要使用支持目录文件描述符的系统调用、打开后核验 inode或把执行放进只挂载允许目录的隔离环境。本系列先把读工具限制在项目内并把规范化后的绝对路径写入授权事件。执行器只能消费授权事件里的路径不能重新使用模型原参数。记忆点是裁决输入可以来自模型执行输入必须来自裁决结果。两者看似重复实际切断了“审的是 A做的是 B”。三、拒绝也是正常控制流工具被拒绝不应抛出含糊的内部异常也不该自动把权限扩大后重试。宿主把outside_roots连同允许根目录反馈给下一轮模型可以选择合规路径。连续拒绝会消耗预算防止模型无限探测目录。不存在的文件与无权访问也应使用不同原因码前者可能通过选择其他文件恢复后者需要用户明确授权。输出上限同样属于权限。读取一个数百兆日志会挤掉上下文并增加费用即使路径合法也可能造成拒绝服务。执行器读取max_bytes 1个字节超限时返回摘要与截断标志而不是默默截断后假装得到完整文件。四、怎样验收策略没有形同虚设至少覆盖正常相对路径、绝对路径、..、相似目录名前缀和指向外部的符号链接。测试不能只断言布尔值还要检查账本追加的原因码与规范化路径。tools.json自身必须由人工控制不能放在 Agent 可写目录否则模型只需给自己增加一个shell工具。本篇输出仍是runs/demo-001/events.jsonl现在多了一条带规范化路径的授权事件。下一篇会读取run_started.payload.goal与这条授权事件生成contract.json把原始目标、允许修改范围和检查命令做成指纹防止重试过程中目标悄悄漂移。参考来源Python 文档pathlib — Object-oriented filesystem pathsOWASPPath Traversal 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《Agent可靠性工程实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。

相关新闻

Agent 可靠性工程实战(一):先给智能循环装一只不可失忆的黑匣子

Agent 可靠性工程实战(一):先给智能循环装一只不可失忆的黑匣子

很多 Agent 教程从模型、提示词和工具调用开始,演示效果很热闹,却跳过了最先该解决的问题:一次任务失败以后,我们能否准确回答模型看到了什么、调用了什么、工具返回了什么、为什么停止。普通文本日志只记录人类觉得重要的句子&am…

2026/7/30 15:57:24阅读更多 →
Python+Flask构建动漫数据可视化系统实战

Python+Flask构建动漫数据可视化系统实战

1. 项目概述:当动漫数据遇上Python可视化 去年帮朋友工作室处理一批动漫评分数据时,我用了三周时间手工整理Excel表格。看着密密麻麻的数字,突然意识到:为什么不用Python把这些数据变成会说话的图表?于是诞生了这个结合…

2026/7/30 15:57:24阅读更多 →
用了“盖州德溢”才发现名声大也有不足?

用了“盖州德溢”才发现名声大也有不足?

你们有没有那种感觉?就是看到某个东西特别火,直播间里一晚上卖几千单,评论区清一色“绝了”“回购N次”,但自己买回来一尝……emmm,也就那样吧。或者更惨一点,味道还行,但一看配料表&#xff0c…

2026/7/30 15:57:24阅读更多 →
单片机计算机毕设之基于单片机的开关柜自动除湿换气控制系统 基于 STM32 的多设备联动柜体智能管控系统(013001)

单片机计算机毕设之基于单片机的开关柜自动除湿换气控制系统 基于 STM32 的多设备联动柜体智能管控系统(013001)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/7/30 19:54:46阅读更多 →
Bevy世界序列化:如何用Rust构建动态游戏数据持久化系统

Bevy世界序列化:如何用Rust构建动态游戏数据持久化系统

Bevy世界序列化:如何用Rust构建动态游戏数据持久化系统 【免费下载链接】bevy A refreshingly simple data-driven game engine built in Rust 项目地址: https://gitcode.com/GitHub_Trending/be/bevy Bevy游戏引擎的世界序列化系统为开发者提供了基于ECS架…

2026/7/30 19:54:46阅读更多 →
单片机毕业设计-基于 STM32 的多传感器环境感知与智能家居控制装置 基于单片机的室内环境参数监测与电器自动控制系统(012801)

单片机毕业设计-基于 STM32 的多传感器环境感知与智能家居控制装置 基于单片机的室内环境参数监测与电器自动控制系统(012801)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/7/30 19:54:46阅读更多 →
Playwright CLI完整指南:为AI编码代理优化的浏览器自动化工具

Playwright CLI完整指南:为AI编码代理优化的浏览器自动化工具

Playwright CLI完整指南:为AI编码代理优化的浏览器自动化工具 【免费下载链接】playwright-cli CLI for common Playwright actions. Record and generate Playwright code, inspect selectors and take screenshots. 项目地址: https://gitcode.com/GitHub_Trend…

2026/7/30 19:54:45阅读更多 →
Equalizer APO:Windows音频优化的终极指南与实用配置技巧

Equalizer APO:Windows音频优化的终极指南与实用配置技巧

Equalizer APO:Windows音频优化的终极指南与实用配置技巧 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否曾经为Windows系统音频效果不佳而烦恼?游戏中的脚步声听不清&…

2026/7/30 19:54:43阅读更多 →
3个技巧让gpt-fast成为你的PyTorch原生文本生成加速器

3个技巧让gpt-fast成为你的PyTorch原生文本生成加速器

3个技巧让gpt-fast成为你的PyTorch原生文本生成加速器 【免费下载链接】gpt-fast Simple and efficient pytorch-native transformer text generation in <1000 LOC of python. 项目地址: https://gitcode.com/gh_mirrors/gp/gpt-fast 想要在PyTorch原生环境中实现超…

2026/7/30 19:52:42阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由&#xff1a;TrollInstallerX让你的iPhone摆脱安装限制 &#x1f680; 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会&#xff08;CCF&#xff09;2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具&#xff1a;DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼&#xff1f;是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →