简介
什么是 SForge
SForge 是一个 Code Agent 评测框架,专为超长程迭代式任务设计。Agent(如 Claude Code 和 Codex)在隔离的 Docker 容器中完成骨架代码,然后提交到独立的 Judge 容器进行评分。Agent 可以多次提交,根据测试反馈迭代改进代码,直到超时为止,最终取所有提交中的最优分作为最终成绩。
SForge 原生支持 EdgeBench,包含 130+ 评测任务,任务覆盖 Python、Java、Go、Rust、C/C++ 等多类运行环境,支持测试驱动、分数优化、交互式游戏、定理证明等多种评测类型。
核心机制
SForge 的设计围绕三个核心机制:
- 双容器隔离 — Work 和 Judge 环境完全分离,从根本上防止评测作弊。Agent 永远无法访问测试套件。
- 闭环迭代评测 — Agent 并非在时间结束后一次性提交并得分,而是在整个运行过程中反复提交,获得细粒度反馈(通过率、失败用例名、分数),据此改进后再次提交,直到超时为止——取所有提交的最优分作为最终成绩。
- 长时程执行保障 — Stop hook 阻止 Agent 过早退出,auto-resume 从瞬时故障中恢复,Kubernetes 后端支持大规模并行运行。
双容器架构
SForge 的核心设计是将 Agent 工作环境与评测环境完全隔离:
┌─────────────────────────┐ ┌───────────────────────────────┐
│ Work Container │ │ Judge Server (host) │
│ │ archive │ │
│ skeleton code + docs │ ────────> │ POST /api/v1/submit │
│ NO test scripts │ (HTTP) │ → spawn judge container │
│ │ │ → extract archive │
│ agent works here │ <──────── │ → run tests │
│ sforge-submit │ results │ → return score + details │
└─────────────────────────┘ └───────────────────────────────┘每个任务构建三个 Docker 镜像:
| 镜像 | 内容 | Agent 可见? |
|---|---|---|
<benchmark>.base.<base_image>:<hash> | 语言运行时 + 常用工具 | — |
<benchmark>.work.<task>:<hash> | 骨架代码 + 文档,无测试 | 是 |
<benchmark>.judge.<task>:<hash> | 骨架代码 + 完整测试套件 | 否 |
- Work 镜像:Agent 的工作区。包含骨架代码和任务文档,但测试脚本已被删除。Agent 在这里编写代码,通过
sforge-submit提交评测。 - Judge 镜像:评测环境。包含完整的测试套件和评测脚本。Agent 永远无法访问这些内容。Judge Server 在收到提交后,会启动一个临时的 Judge 容器来运行测试。
- Base 镜像:每种语言共享一个基础镜像(如
python:3.11、golang:1.22),预装了语言运行时和常用工具。
迭代式评测
SForge 支持 Agent 多次提交代码进行评测,每次都能获得反馈:
- Agent 在 Work 容器中实现代码
- 调用
sforge-submit提交当前代码 - Judge Server 启动 Judge 容器,运行测试,返回反馈(通过率、失败的测试名等)
- Agent 根据反馈改进代码,再次提交
- 重复上述过程直到超时,取所有提交的最高分
此外,SForge 内置了 auto-eval 自动评测机制:后台守护进程会定期(默认 300 秒)自动提交代码进行评测,确保 Agent 的进展被及时记录,即使 Agent 忘记手动提交。
长时程执行保障
评测任务通常需要数十分钟甚至数小时运行,SForge 通过多种机制确保 Agent 能充分利用分配的时间:
- Stop Hook:拦截 Agent 的退出请求,阻止其在时间耗尽前提前退出。Agent 认为"任务已完成"时,Stop Hook 会要求它继续检查和改进代码。
- Auto-Resume:当 Agent 因 API 断连、瞬时错误等异常退出时,框架自动使用 Agent 的会话恢复机制(如
claude --continue)重新启动,并将剩余超时预算传递给恢复后的会话。 - Kubernetes 后端:支持大规模并行运行,同时评测多个任务或多个 Agent。