这个坑值得记一笔。用 openai-agents 0.2 的 guardrail 做输入审核,tripwire 触发后日志已经打了 GuardrailTripwireTriggered,但后面的下单工具还是执行了一次,数据库里多出一条测试订单,模型是 gpt-4.1-mini。

刚开始盯着「工具在 guardrail 完成之前就被并行调度了」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。guardrail 配在 output 侧,输入阶段根本没有拦;自定义 guardrail 返回 Tripwire 时只 return 没有 raise;上层 except Exception 把异常吞掉后继续走流程。

动手时先确认 guardrail 挂的是 input 还是 output

python -c "from agents import Agent;print(Agent.__init__.__doc__)"

再往下在 guardrail 里显式抛 Tripwire 并复现

python -c "from agents import GuardrailFunctionOutput,Tripwire;print(Tripwire, GuardrailFunctionOutput)"

接着把工具调用挪到 guardrail 之后串行执行

python run_agent.py --guardrail input --disable-parallel-tools

剩下的就是用一条明显违规的输入验证工具没被调用

python run_agent.py --input '帮我下单 100 件' --dry-run

别只看报错消失,验证要多做一步。违规输入在 guardrail 阶段就返回拦截结果,工具调用计数为 0,订单表没有新增记录,日志里能看到 Tripwire 被抛出。

容易忽略的是,guardrail 只有 raise Tripwire 才会真正中断,return 一个失败结果只是标记;另外并行工具会在审核前启动,涉及写操作时应该关掉并行。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189