mini-swe-agent 单实例 SWE-bench 运行脚本 swebench-single 完全指南
mini-swe-agent 单实例 SWE-bench 运行脚本 swebench-single 完全指南
导读
swebench-single 是 mini-swe-agent 提供的用于在单个 SWE-bench 任务实例上运行 Agent 的 CLI 入口,专为调试、复现与分析设计:你可以用实例 ID(如 sympy__sympy-15599)或索引号精确定位某一条 issue,并在交互式提示下观察 Agent 逐步完成修复。读完本文,你将掌握该脚本的全部命令行参数、默认配置(swebench.yaml)的行为语义、源码级执行链路(从数据集加载到环境拉起、Agent 运行、轨迹保存),以及如何借助测试用例验证你的用法。
一、脚本定位:单实例调试 vs 批量评测
在 mini-swe-agent 的 SWE-bench 支持中,官方提供了两个互补的脚本(见 SWE-bench 使用指南):
| 脚本 | 入口 | 适用场景 |
|---|---|---|
swebench(批量) |
mini-extra swebench |
在全部/筛选的任务实例上并行运行,产出 preds.json 评测文件 |
swebench-single(单实例) |
mini-extra swebench-single |
在单个任务实例上运行,带交互性,适合调试 |
两者共享同一套数据源与环境构建逻辑:swebench_single.py 从 swebench.py 导入 DATASET_MAPPING 与 get_sb_environment。但二者有一个关键区别:单实例模式不会生成 preds.json,它只输出单条轨迹文件(trajectory),因此不能被直接拿去 SWE-bench 评测——它的价值在于让你"看见"Agent 如何思考、如何执行命令、如何收敛到最终补丁。
从源码结构看(swebench_single.py),该脚本是一个基于 typer 的独立命令应用,
main函数即 CLI 入口,因此既可经mini-extra swebench-single调用,也可直接python src/minisweagent/run/benchmarks/swebench_single.py执行。
二、快速上手:两条最常用的运行命令
先查看帮助:
mini-extra swebench-single --help
# 或直接运行源码入口
python src/minisweagent/run/benchmarks/swebench_single.py --help
按实例 ID 运行(推荐,结果可复现):
mini-extra swebench-single \
--subset verified \
--split test \
--model anthropic/claude-sonnet-4-5-20250929 \
-i sympy__sympy-15599
按索引运行(第 0 个实例):
mini-extra swebench-single \
--subset verified \
--split test \
-m anthropic/claude-sonnet-4-5-20250929 \
-i 0
⚠️ Docker 架构注意:SWE-bench 官方 Docker 容器假定 x86 Linux 架构,在其他 CPU 架构(如 ARM)上可能无法运行。
💡 如果不希望在 Agent 结束任务时弹出确认提示,请追加
--exit-immediately标志(下文详述)。
三、命令行参数全解
以下参数定义直接取自 swebench_single.py 的 typer 声明,按功能面板归类:
数据选择(Data selection)
| 参数 | 默认值 | 说明 |
|---|---|---|
--subset |
lite |
SWE-bench 子集名称,或一个可直接被 datasets.load_dataset 加载的本地/远程数据集路径 |
--split |
dev |
数据集的 split 名称(如 dev、test) |
-i, --instance |
0 |
SWE-bench 实例 ID(如 sympy__sympy-15599)或实例索引(数字) |
基础(Basic)
| 参数 | 默认值 | 说明 |
|---|---|---|
-m, --model |
None |
使用的模型名称(如 anthropic/claude-sonnet-4-5-20250929) |
-c, --config |
swebench.yaml(内置基准配置) |
配置文件路径/文件名/键值对,可多次指定,多个配置会递归合并 |
-o, --output |
全局配置目录下的 last_swebench_single_run.traj.json |
输出轨迹文件路径 |
高级(Advanced)
| 参数 | 默认值 | 说明 |
|---|---|---|
--model-class |
None |
模型类,如 'anthropic' 或完整路径 minisweagent.models.anthropic.AnthropicModel |
--agent-class |
None |
Agent 类,如 'interactive' 或完整路径 minisweagent.agents.interactive.InteractiveAgent |
--environment-class |
None |
环境类,如 'docker' 或完整路径 minisweagent.environments.docker.DockerEnvironment;推荐 docker 或 singularity |
-y, --yolo |
False |
跳过确认直接运行 |
-l, --cost-limit |
None |
成本上限;设为 0 表示禁用 |
--exit-immediately |
False |
Agent 想结束时立即退出,不再弹出交互确认 |
关于 -c/--config 的关键行为(务必注意)
-c 的帮助文本中有一条红色警告(见 swebench_single.py):
IMPORTANT: 如果你设置了该选项,默认配置文件将不再被使用。 因此你需要显式地把默认配置也带上,例如
-c swebench.yaml <其他选项>。
常见错误示例(缺少默认配置文件):
# ❌ 错误:这样会丢掉 swebench.yaml 中的提示词模板、步数限制等全部默认设置
mini-extra swebench-single -c model.model_kwargs.temperature=0 ...
正确写法(默认配置 + 覆盖项,多个配置递归合并,后者优先):
# ✅ 覆盖模型温度
mini-extra swebench-single -c swebench.yaml -c model.model_kwargs.temperature=0.5 ...
# ✅ 切换 Agent 模式
mini-extra swebench-single -c swebench.yaml -c agent.mode=yolo ...
这里的"配置文件解析"由 config/init.py 实现:get_config_from_spec 会先判断 spec 中是否含 =,若含则按 a.b.c=value 的点分路径解析为嵌套字典(值优先按 JSON 解析);否则调用 get_config_path 依次在 MSWEA_CONFIG_DIR、内置 config/、config/extra/、config/benchmarks/ 中查找 .yaml 文件。合并逻辑见 serialize.py 的 recursive_merge:后续字典覆盖先前字典、嵌套字典递归合并、UNSET 哨兵值被跳过——这正是"命令行覆盖默认配置"机制的底层原理。
四、默认配置:swebench.yaml 的核心语义
脚本默认加载 swebench.yaml,它决定了单实例运行时的完整行为。理解它比记住每个参数更重要,因为命令行参数本质上只是对这份配置的覆盖。
agent 段:任务提示词与运行限制
instance_template 使用 Jinja2 模板把任务的 PR 描述({{task}})注入系统提示,并给出完整任务指令:要求模型持续与 shell 交互、只修改非测试文件、先复现问题再修复再验证,最终以 git diff 生成补丁并以精确命令 echo COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT && cat patch.txt 提交。
agent:
step_limit: 250 # 最大交互步数
cost_limit: 3. # 成本上限(美元)
environment 段:容器化运行环境
environment:
cwd: "/testbed" # Agent 的工作目录
timeout: 60 # 单条命令超时(秒)
interpreter: ["bash", "-c"]
env:
PAGER: cat
MANPAGER: cat
LESS: -R
PIP_PROGRESS_BAR: "off"
TQDM_DISABLE: "1"
BASH_ENV: /root/.bashrc # 确保容器内 conda activate testbed 生效
environment_class: docker
BASH_ENV 的注释点出了一个容器细节:bash -c 是非登录 shell,不会自动 source ~/.bashrc,而 SWE-bench 镜像依赖 /root/.bashrc 中的 conda activate testbed 激活正确 Python 环境,因此必须显式指向它。
model 段:观察模板与默认模型
model:
model_name: "anthropic/claude-sonnet-4-5-20250929"
model_kwargs:
drop_params: true
parallel_tool_calls: true
observation_template 控制命令执行结果的回显格式:正常输出嵌入 <output> 标签;若命令输出超过 10000 字符,则折叠为"头部 5000 字符 + 中间省略计数 + 尾部 5000 字符"并附带警告,防止长输出淹没模型的上下文。format_error_template 则处理两种失败模式:输出 token 用尽(finish_reason == "length")时提示模型更简洁并恰好以一次 bash 调用收尾;普通工具调用格式错误时给出通用纠错指引。
五、源码级执行链路:从数据集到轨迹文件
结合 swebench_single.py 的 main 实现,一次运行共经历五步:
1. 解析 subset 并加载数据集
dataset_path = DATASET_MAPPING.get(subset, subset)
instances = {
inst["instance_id"]: inst
for inst in load_dataset(dataset_path, split=split)
}
DATASET_MAPPING(定义于 swebench.py)提供常用别名:
| 别名 | Hugging Face 数据集 |
|---|---|
full |
princeton-nlp/SWE-Bench |
verified |
princeton-nlp/SWE-Bench_Verified |
lite |
princeton-nlp/SWE-Bench_Lite |
multimodal |
princeton-nlp/SWE-Bench_Multimodal |
multilingual |
swe-bench/SWE-Bench_Multilingual |
smith |
SWE-bench/SWE-smith |
rebench |
nebius/SWE-rebench |
_test |
klieret/swe-bench-dummy-test-dataset(内部测试用) |
不在映射中的 --subset 值会被原样当作数据集路径传给 load_dataset,因此只要数据集遵循 SWE-bench 字段格式(含 instance_id、problem_statement),即可跑自定义数据集。
2. 解析实例选择:ID 或索引
if instance_spec.isnumeric():
instance_spec = sorted(instances.keys())[int(instance_spec)]
instance = instances[instance_spec]
数字被解释为按 instance_id 排序后的下标,非数字则直接作为 ID 查询;查不到会抛 KeyError。
3. 合并配置:CLI 参数 → 嵌套配置
configs = [get_config_from_spec(spec) for spec in config_spec]
configs.append({
"agent": {
"agent_class": agent_class or UNSET,
"mode": "yolo" if yolo else UNSET,
"cost_limit": cost_limit if cost_limit is not None else UNSET,
"confirm_exit": False if exit_immediately else UNSET,
"output_path": output or UNSET,
},
"model": {"model_class": model_class or UNSET, "model_name": model_name or UNSET},
"environment": {"environment_class": environment_class or UNSET},
})
config = recursive_merge(*configs)
注意 UNSET 的用法:未显式指定的 CLI 参数以 UNSET 占位,recursive_merge 会跳过它们,从而不覆盖配置文件中的既有值。这里有一个值得注意的实现细节——exit_immediately 会设置 agent.confirm_exit: False(而非直接设置"退出"动作),而 --exit-immediately 对交互行为的实际生效还依赖 Agent 实现(交互式 Agent 在结束时会询问用户是否确认退出,置 False 即跳过询问)。
测试 test_swebench_single.py 专门验证了 cost_limit=0 在合并后仍被保留(assert mock_get_agent.call_args.args[2]["cost_limit"] == 0)——因为 0 是有效值(表示禁用成本上限),若用 cost_limit or UNSET 这类写法就会被误判为空值而丢弃,源码特意写成 if cost_limit is not None,这正是"显式 0 不丢失"的保障。
4. 构建环境并启动 Agent
env = get_sb_environment(config, instance)
agent = get_agent(get_model(config=config.get("model", {})), env, config.get("agent", {}), default_type="interactive")
agent.run(instance["problem_statement"])
环境构建复用 swebench.py 的 get_sb_environment(swebench.py),其逻辑包括:
- 默认
environment_class为docker; - 镜像名推断:优先取实例自带的
image_name或docker_image字段;否则由instance_id生成docker.io/swebench/sweb.eval.x86_64.<instance_id>:latest(Docker 不允许双下划线,故__会被替换为魔法 token_1776_); - 环境类适配:
docker/swerex_modal直接使用镜像名,singularity/contree则前缀docker://; - 若配置中存在
run.env_startup_command,会用 Jinja2 以实例字段为模板变量渲染并预先在环境中执行(如git clone {{ repo_url }} . --force),返回码非 0 则抛错中止。
与批量脚本不同,单实例模式的默认 Agent 类型是 interactive(见 default_type="interactive"),这正是其"交互调试"定位的体现。
5. 运行与输出
Agent 收到 problem_statement(issue 描述)后开始迭代:思考 → 执行 bash 命令 → 观察输出 → 继续,直至提交补丁或触及 step_limit/cost_limit。运行结束后轨迹默认保存为:
<全局配置目录>/last_swebench_single_run.traj.json
可通过 -o 自定义路径。测试 test_swebench_single.py 展示了端到端验证方式:使用 _test 子集 + DeterministicModel(test_models.py)注入固定模型回复,断言 get_model 被调用且输出轨迹文件存在。
六、实践建议与 FAQ 要点
以下要点整理自 SWE-bench 使用指南 FAQ 中与单实例调试直接相关的部分:
- 首拉镜像较慢:首次运行会
docker pull对应实例的镜像,可能长时间停留在环境初始化。第二次运行即会立即启动;若docker pull超时,可在配置中调大environment.pull_timeout(默认 120 秒)。 - Docker 问题排查:控制台会打印 docker 命令,可手动执行复现;用
docker ps确认容器在跑,用docker exec -it <container-id> ls验证可交互。 - HPC 上无 Docker:将
environment.environment_class设为singularity(命令行--environment-class singularity或配置文件均可),参考 环境选择指南 与 YAML 配置文档。 - 需要环境预初始化:使用
run.env_startup_command配置项,例如apt-get update && apt-get install -y python3-pip,或用实例字段做模板渲染(git clone {{ repo_url }} . --force),这对bubblewrap等轻量环境尤为有用。 - 交互确认:默认在 Agent 结束时会弹交互式确认(这也是交互式 Agent 的特性之一);调试脚本或自动化流程中请加
--exit-immediately。
七、与批量脚本的差异速查
| 维度 | swebench(批量) |
swebench-single(单实例) |
|---|---|---|
| 默认 Agent 类型 | ProgressTrackingAgent 包装(见 common.py) |
interactive(交互式) |
| 实例选择 | --slice / --filter / --shuffle / --redo-existing |
-i(ID 或索引) |
| 输出 | 目录:preds.json、<instance_id>.traj.json、minisweagent.log、exit_statuses_*.yaml |
单个轨迹文件,默认 last_swebench_single_run.traj.json |
| 并发 | -w/--workers 线程池并行 |
单实例串行 |
| 用途 | 评测跑分 | 调试、复现、观察单条轨迹 |
在 tests 中可以看到单实例脚本的三类测试:配置合并保真(cost_limit=0)、确定性模型端到端、--exit-immediately 行为验证——如果你扩展或修改了该脚本,这些测试是回归保障的参照。
结语
swebench-single 把"在 SWE-bench 上跑一个 Agent"这一操作收敛到一条可复现、可观测的命令:通过 -i 精确定位任务、-c 递归合并配置、--exit-immediately 去除交互打扰,再配合 swebench.yaml 中的提示词与限制语义,你可以在几分钟内复现任意 SWE-bench 实例的完整修复轨迹。本文覆盖了从参数到源码、从默认配置到测试验证的完整链路,可作为继续阅读 API 参考、SWE-bench 使用指南 与 全局配置文档 的起点。