跳转到主要内容
Sandbox 默认在每个 Attempt 结束后销毁。大多数问题先用 niceeval show @<attempt-locator> 或 niceeval view 查看判定、断言、文件改动、命令和对话就能定位,完整路线见排查手册。 但有些问题只能进活的环境里看:
  • 环境起不来:setup 阶段装依赖失败、agent CLI 启动不了。这时 agent 还没开始跑,对话记录是空的,最快的办法是进 Sandbox 手动重跑一遍安装命令。
  • 改动落在 git diff 之外:全局装了什么包、$HOME 下写了什么配置、PATH 实际是什么,保存下来的文件改动不包含这些内容。
  • 重跑太慢:冷启动加安装要几分钟。想逐条验证猜测时,留着现场比每次重跑快得多。

跑的时候保留现场

在 niceeval exp 上加 --keep-sandbox:
--keep-sandbox 有两档:
  • failed(默认值)保留判定为 failed 或 errored 的 Attempt,包括超时被打断的。
  • all 连通过的也保留。调 setup Hook、核对通过时环境的真实状态时用它,不用故意让一条评估用例失败。
不带这个参数时全部销毁。加了 --keep-sandbox 的运行总会真实执行,不会沿用上次的结果。 运行结束后,摘要里会列出保留了哪些 Sandbox、怎么进去:
每行给三样东西:Attempt locator、Sandbox 实例 id、进入现场的命令。这次 Attempt 保存下来的结果,用 niceeval show @<attempt-locator> 或 niceeval view --run <run-id> 查看。 保留下来的 Sandbox 不会一直跑着消耗资源:Docker 容器停在磁盘上,E2B 微 VM 暂停计费,Vercel 保存文件系统。

进入现场

niceeval sandbox enter 会先唤醒再进入,在工作目录打开 shell。进去之后就是这次 Attempt 跑完时的环境,可以手动执行命令、翻文件、复现失败。 退出 shell 后,现场自动回到休眠。想让它保持运行,加 --leave-running。

查看和清理

保留下来的 Sandbox 由项目记录在案,用 niceeval sandbox 管理:
这些管理命令不读取 niceeval.config.ts。即使配置文件暂时无法执行,你仍可以查看或销毁现场。命令会读取 .env 来准备 Provider 凭据;.env 不可读时,先修复它再重试。 sandbox 命令没有 --json 输出。niceeval sandbox list --json 会直接提示 Unknown option '--json',不会继续打印人读文本。 stop 可以重复执行。Sandbox 已经不在了(手动删过、云端过期)不算错误,命令只会把记录移掉并说明。如果 Provider 销毁失败,命令会保留记录并返回错误,方便稍后重试,不会把仍活着的资源从列表里藏掉。 忘了清理也有提醒:下次运行开始时,如果还有上次保留的 Sandbox,终端会打一行提示。

各 Provider 的差别

  • Docker:容器停在磁盘上,不占内存,重启 Docker 也还在,进入时自动启动。容器不会自己消失,是唯一需要主动清理的 Provider。除了 niceeval sandbox stop,也可以用 docker ps -a -f label=niceeval.keep-candidate=true 直接核对。
  • E2B:暂停微 VM,文件和内存整体保存。暂停期间停止计费、无限期保留,进入时自动恢复。
  • Vercel Sandbox:停止微 VM,文件系统保存、之后可恢复,但内存状态不保留,唤醒后进程要重新启动。超过 Provider 的保留期限后,niceeval sandbox list 会标成 expired。
  • 自定义 Provider:defineSandbox 产出的 Provider 不支持保留现场。事后的 sandbox stop 不加载用户配置,无法在新进程里安全找回你写的销毁函数。

边界

保留的 Sandbox 只用来排查,不能接着跑,也不能重新评分。判定、断言和文件改动以已经保存的结果为准。在现场里改了什么都不会写回结果。查看结果的方法见查看运行结果。 运行被强杀后留下、没有登记的 Sandbox 不在 sandbox list 里,回收方法见运行被强杀后恢复。