先看现象。promptfoo 0.95 的配置里写了 assert: [{type: javascript, value: "output.includes('退款')"}],跑一百条用例全部报 javascript assertion failed: eval is not allowed,改成函数写法也一样。

真正麻烦的地方在于,几个原因的现象几乎一样。运行环境启用了沙箱,禁止动态执行字符串。另一种情况是断言返回的不是布尔值,框架按失败处理。

还有一种情况,变量名写成了 response,实际注入的是 output。

另外,Node 版本过低,可选链在断言里直接语法错误。

先换成内置断言确认链路是否正常

npx promptfoo eval -c promptfooconfig.yaml --filter-failing

再往下把断言写成外部文件再引用

npx promptfoo eval -c config.yaml --max-concurrency 1

随后在断言里只返回布尔并打印中间值

python -c "print({'assert':'output.includes(\"退款\")'})"

降级到 contains 断言,避免执行任意脚本

python -c "print({'type':'contains','value':'退款'})"

怎么算真的好了,看的是同一批现象。同一批用例跑通,失败项能正确标红,输出里能看到断言的期望值与实际值。

补一句。能用内置断言表达的就别写脚本,沙箱限制是安全设计不是 bug,绕过去的代价通常比换一种断言方式高。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189