目录入口见 README。它服务的榜单见 swe-bench-live。
本页属于
submission/opensources/——该子目录放打榜配套仓库(基准工具链 + 环境/任务生成 + harness 接入),与submission/根下”一榜一页”的榜单页分开。本页属”harness 接入”一类。
一句话
把 SWE-agent 改造成一个能跑 SWE-bench-Live 的评测 harness——用本地 JSONL 喂题、用 Azure 模型跑 rollout、照 SBL 的合规要求产出 patch 与轨迹。
要分清它不是什么:
| 容易误解 | 实际 |
|---|---|
| 独立的 agent 框架 | 是 SWE-agent/SWE-agent 的 fork,只加了少量评测适配 |
| 官方评测器 | 评测判分仍由 microsoft/SWE-bench-Live 官方 evaluator 负责,本仓库只产 patch |
| 通用开箱工具 | 强绑定 Azure OpenAI + 私有 token broker(cloudgpt_aoai),外部直接跑需替换模型接入 |
| 官方组织仓库 | 个人 fork(作者 Karina Kenan Li),但作者是 SBL submission 仓库 CONTRIBUTOR |
与上游 SWE-agent 的关系
上游 SWE-agent/SWE-agent 是 NeurIPS 2024 论文项目,20,384 stars / MIT,是”给一个 GitHub issue 自动改代码”的开山之作。
本 fork 的实际情况:
| 项目 | 值 |
|---|---|
| fork 点 | 上游 0f4f3bba(2026-03-24,litellm 依赖排除那次提交) |
| 自建 commit | 仅 4 个(2026-05-22 ~ 06-02) |
| 代码基线 | SWE-agent 1.1.0,要求 Python ≥ 3.11(README 用 3.12) |
| stars | 0(内部/评测用途,不追求社区) |
| 默认分支 | main |
4 个自建 commit:
8242242 2026-06-02 Update README.md ← 重写为评测上手指南
0d337a1 2026-05-29 debug ← 超时/exit 处理调试
f415d19 2026-05-27 local changes ← 环境健壮性修正
23a7d5b 2026-05-22 adpapt to local datasets ← 主干适配(本地数据源 + 内联 swerex)
作者在同一条工作线上还维护了
OpenHands-for-eval(描述明确写 “compatible with SWE-bench-Live”)、ClaudeCode-for-eval、SWE-agent-RL、Anthropic_Router,并在SWE-bench-Live/submission提交了合规 checklist(PR #35)与评测 CI workflow(PR #45)。这组仓库合起来才是完整意图:给 SBL 打榜提供可复现的 harness 家族。
Fork 改了什么
只有 43 个文件相对 fork 点有差异,去掉内联的 swerex/ 后,真正的适配改动就 8 处:
| 文件 | 改动 | 为什么 |
|---|---|---|
README.md | 150 行删到 24 行 | 从通用文档换成”评测怎么跑”三步 |
config/default.yaml | 默认模型改 azure/gpt-5.5-20260424;prompt 加禁 git 条款 | 评测合规 |
sweagent/agent/models.py | 加 azure/ 分支:cloudgpt_aoai token provider + 固定 api_base/api_version | 走 Azure 企业网关 |
sweagent/run/batch_instances.py | 数据源从 HF load_dataset 换成读本地 JSONL;subset 从 Literal 放开成 str;image_name 回退到 docker_image | 用自备题目集,不依赖 HF 在线拉取 |
sweagent/agent/agents.py | 新增 _sanitize_exit_commands;命令行超时硬编码 90 分钟、总超时 5 小时 | 对齐 SBL 评测时限 + 防容器被 exit 打死 |
sweagent/environment/swe_env.py | 关掉 _copy_repo/get_reset_commands;加 bind 'set disable-completion on' | 题目环境已就位;防 tab 补全污染 PTY 输入 |
pyproject.toml + swerex/ | 移除 swe-rex 依赖,把 SWE-ReX 1.4.0 整个内联进仓库 | 锁定运行时版本,不受外部包漂移影响 |
| 删除 5 个配置 | bash_only / coding_challenge / default_backticks / default_mm_no_images / default_mm_with_images | 只保留 Python issue 修复路线 |
重要澄清:config/benchmarks/ 下那 5 个配置(含 *_sbl.yaml)是上游自带的(2025-02 / 2025-05 提交),不是这个 fork 新增的。也就是说上游 SWE-agent 本身就长期维护 SWE-bench-Live 的评测配置,这个 fork 只是把它接到自己的 Azure 环境上跑。
架构与执行链路
flowchart TD A["sweagent run-batch<br/>--config + --instances"] --> B[SWEBenchInstances] B -->|"读本地 JSONL<br/>problem_statement + docker_image"| C[SimpleBatchInstance] C --> D["DefaultAgent<br/>step 循环"] D -->|"工具调用"| E["ToolHandler<br/>registry / edit_anthropic /<br/>review_on_submit_m / diff_state / filemap"] E -->|"bash + str_replace_editor"| F["SWEEnv → SWE-ReX<br/>Docker 容器"] F -->|"observation"| D D -->|"submit"| G["submit 工具<br/>git add -A && git diff --cached<br/>→ /root/model.patch"] G --> H["SaveApplyPatchHook<br/>写出 .patch + .traj"] H --> I["preds.json / trajs/<br/>交给 SBL 官方 evaluator"]
关键模块(都在 sweagent/ 下):
| 模块 | 职责 |
|---|---|
run/run_batch.py | 批量入口,ThreadPoolExecutor 并发多题;子命令即 sweagent run-batch |
run/batch_instances.py | 题目加载(fork 改成读 JSONL),产出 SimpleBatchInstance |
agent/agents.py | DefaultAgent 主循环:模型 → 动作 → 环境 → observation,含重试与超时兜底 |
agent/models.py | LiteLLMModel 统一模型层,fork 在此插 Azure 分支 |
agent/reviewer.py | 提交前 review 子流程(配合 review_on_submit_m) |
environment/swe_env.py | 容器内 bash 会话、文件读写、repo 状态 |
tools/tools.py | 工具注册、多行输入守卫、submit 命令识别 |
run/hooks/apply_patch.py | 逐题落盘 patch/轨迹(已用 threading.local() 修并发串题) |
怎么跑起来
git clone https://github.com/njukenanli/SWE-agent-for-eval.git
cd SWE-agent-for-eval
python3.12 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip && pip install --editable .
# 关键一步:把内联的 swerex 塞进虚拟环境
# (因为 pyproject 已移除 swe-rex 依赖,不复制则 import 失败)
cp -r swerex venv/lib/python3.12/site-packages/swerex配置模型(默认走 Azure,需要企业网关凭据):
pip install openai azure-identity-broker --upgrade
# 把 agent.model.name 设为 azure/gpt-... 并准备好 cloudgpt_aoai.py(已被 .gitignore 忽略)发起 rollout(--instances.subset 指向你的题集 JSONL):
nohup sweagent run-batch \
--config config/default.yaml \
--num_workers 1 \
--instances.type swe_bench \
--instances.subset dataset/path.jsonl \
> log.out 2>&1 &
--instances.subset在这里不再是lite/verified这种枚举,而是一个本地 JSONL 文件路径——这是 fork 改subset: str+ 换数据加载方式的直接结果。
想用 Anthropic 路线,可换用 config/benchmarks/ 里的现成配置:
| 配置 | 模型 / 题集 | 特点 |
|---|---|---|
250212_sweagent_heavy_sbl.yaml | claude-3-7-sonnet-latest | retry 型:10 次尝试 + o1 做 chooser |
250225_anthropic_filemap_simple_review.yaml | claude-3-7-sonnet-20250219 | simple review,$2/题上限,150 次调用 |
250522_anthropic_filemap_simple_review.yaml | claude-sonnet-4 | verified split,$3/题,150 次调用 |
250526_anthropic_filemap_simple_review_sbl.yaml | claude-sonnet-4 | SBL 提交用,lite,$5/题,不设调用上限 |
anthropic_filemap_multilingual.yaml | 由 CLI 指定 | 多语言版,加 multilingual_setup 工具、去 Python 专属措辞 |
⚠️ 这 5 个配置是上游写法(
subset: lite走 HF 枚举)。fork 已经把加载逻辑改成open(self.subset)读本地文件,所以直接拿来跑需要把 yaml 里的instances.subset换成你的 JSONL 路径,否则会当成名叫lite的文件去打开。
关键设计解读
1. 为什么 prompt 里禁 git?
default.yaml 的 instance_template 末尾直接写了:
IMPORTANT NOTES:
1. Do not commit your edits, we will do it later. When you want to submit, just use the submit tool.
2. Do not use any git command. Git command is forbidden. If you use any git command your
solution would be immediately judged as failed!
唯一例外是 review 阶段回滚测试文件的 git restore(默认配置里替掉了上游的 git checkout --)。原因对应 swe-bench-live 的核验条款:patch 必须来自单次 rollout 的模型改动,agent 若自行 git commit/reset/stash 会让”改了什么”不可追溯,直接判违规。
值得注意的是:harness 自己反而重度依赖 git——tools/review_on_submit_m/bin/submit 内部执行 git add -A && git diff --cached > /root/model.patch 来采集统一 diff(diff_state 也读 /root/model.patch)。所以这条禁令约束的是模型动作,不是采集机制。
2. _sanitize_exit_commands 解决什么?
agents.py 新加的正则会把命令位置上的裸 exit 改写成子 shell 形式 (exit):
# 原命令: cd /repo && pytest && exit 0
# 改写后: cd /repo && pytest && (exit 0)因为 SWE-agent 的 bash 会话是 pexpect 常驻进程,模型一旦真的 exit,容器 shell 直接 EOF,整题崩掉。放进子 shell 后既能拿到退出码,又保住父 shell。这是很典型的”跑评测才暴露”的健壮性问题。
3. 超时为什么被硬编码?
配置项 execution_timeout(默认 30s)和 total_execution_timeout(默认 1800s)在 fork 里被绕过,写死成 90 分钟单命令 / 5 小时总时长,代码注释写得明白:# 1.5 h limit to align with evaluation code。这是为了对齐 SBL 评测环境的时限,不是随手放大——同时也意味着改配置里的超时字段不会生效,要改得动代码。
4. tab 补全那条为什么要加?
swe_env.py 注入 bind 'set disable-completion on',注释解释得很清楚:Go 这类用 tab 缩进的语言,代码经 PTY 送入 bash 时会触发 readline 补全,把命令内容搅乱。属于多语言/非 Python 场景下的输入管道问题。
5. 内联 swerex 的代价与收益
swerex/ 被整个 vendored(约 3,800 行,含 docker/modal/daytona/fargate/local 五种 deployment 后端),收益是版本锁死、不随 swe-rex 上游漂移;代价是必须手动 cp 进 site-packages,否则 pip install -e . 之后 import swerex 失败。这是项目最容易踩的一步。
怎么接到 SWE-bench-Live 打榜
本 harness 的产出正好是 SBL 提交要的材料,映射关系:
| SBL 必填物 | 本仓库对应产物 |
|---|---|
preds.json | 逐题 .patch(SaveApplyPatchHook 落盘)→ 按 instance_id 汇总 |
trajs/ | *.traj 轨迹文件(含完整 prompt 与每轮工具往返) |
README.md 实验设置 | 从 config/*.yaml 提取:模型、per_instance_cost_limit、per_instance_call_limit、rollout 次数 |
| 网络隔离证明 | 本仓库不含,需自己在 Docker --internal 层实现 |
流程衔接见 swe-bench-live「第 3 步:接入自研 agent」,完整提交链路见该页「第 4 步:提交 PR」。
用它打榜时注意:
250526_..._sbl.yaml只是配置基线,不等于合规。protocol-trajectories-included、网络隔离、单次 rollout 这些仍需自己保证。
常见坑
- 忘了
cp -r swerex→import swerex失败或版本校验不过(impose_rex_lower_bound要求 ≥ 1.2.0,内联版本是 1.4.0)。 --instances.subset传lite→ fork 已把它当文件路径,会open("lite")报错;要么传 JSONL 路径,要么在配置里写路径。- 以为改 yaml 超时就生效 → 单命令/总超时写死在
agents.py,配置字段被绕过。 cloudgpt_aoai.py缺失 → 该文件被.gitignore排除,是 Azure 企业 token broker,仓库里没有,走azure/模型必须先自己准备。- 非 Azure 路径参数被注释 →
models.py的 else 分支把temperature/top_p/api_version注释掉了,换模型时要确认这些参数是否真的生效。 - 默认 prompt 仍是 Python 措辞 →
default.yaml已把 “python code repository” 改成泛称,但config/benchmarks/*里仍是 Python 版;跑多语言请用anthropic_filemap_multilingual.yaml。 - 把它当评测器 → 它只产 patch,判分要交给
microsoft/SWE-bench-Live官方 evaluator。 - 并发跑批串题 → 上游已在
SaveApplyPatchHook用threading.local()修复(fork 基线含此修复),但 fork 点若更早需自行确认。
相关
- swe-bench-live — 它服务的打榜指南(提交材料 / 核验条款 / 成本)
- README — 打榜目录入口
- swe-bench-verified — SWE-bench 家族与 mini-SWE-agent 对照
- harbor — 另一种评测执行框架(多 harness 横向对比用)
信源
信息来自本地 clone(~/6ai/opensources/SWE-agent-for-eval,HEAD 8242242)对 fork 点 0f4f3bba 的 git diff、上游与 fork 的 GitHub API 元数据、5 个 benchmark 配置与工具 bundle 源码、以及 SWE-bench-Live/submission PR #35 / #45 记录。数据截至 2026-09-22。