第 5 卷
都有人管。这一节我们把这两条边界划出来。
入口:code 模式下,模型绕过程序直接点名 env_probe?不行,UNKNOWN_TOOL:对模型而言它根本不存在,不是“存在但不许调”:
复制代码
| 1 | ---模型绕过run_code,直接点名调env_probe --- |
|---|---|
| 2 | {"isError":true, |
| 3 | "error": {"message":"unknown tool \"env_probe\": only `run_code` is callable |
| 4 | "content": [ ... ] } |
子调用:那程序里面的调用呢?照样管得住。先挂一道守卫禁掉 env_probe,再让程序 try/catch 去调它——await tools.env_probe({}) 抛 ToolCallError,接住后照
常往下跑(后面的 add({ a: 3, b: 4 }) 照算,得 sum: 7),外层 run_code 仍成功:守卫对子调用一视同仁,拒绝在这里变成可捕获的异常。
复制代码 1--- 守卫能否管住程序里的子调用 ---
2{ "isError": false, 3"value": { "logs": [], "result": { "probe": "caught: env_probe 已被禁用", "sum":
这里我们验证完毕,对于 Code Mode 来说,执行边界依旧存在,无论是入口还是子调用,都必须经过刚刚讲过的工具流水线,不能肆意越界。
本讲小结
这一讲,我们把上一讲提到的工具执行展开成一条流水线,一次调用要依次穿过八站,结构固定,不因挂不挂钩子而变。
往里看:pre-execute 放行 / 拒绝 / 去问人(ask 没人应答即拒),守卫只拒或弃权(所以单调),post-execute 能拦能改。
换个入口也跑不掉:Code Mode 只给一个 run_code,子调用照过完整流水线——入口有 UNKNOWN_TOOL 拦,子调用有守卫管。
本卷图片
本页图片
