# SWE-bench

## 简介

[SWE-bench](https://www.swebench.com/) 是评估大型语言模型（LLMs）在真实软件工程任务上能力的基准测试套件，每个样本对应一个真实 GitHub 仓库的 Issue–PR 配对，模型需要产出可通过单元测试的代码补丁（patch）。

EvalScope 集成 SWE-bench 后提供两种评测模式：

- **Oracle 单轮模式**：将检索到的相关代码上下文一次性提供给模型，模型直接生成 patch
- **Agentic 多轮模式**：仅向模型提供 issue 描述，模型在每个实例独立的 SWE-bench Docker 容器中通过 `bash` 多轮探索、修改源码并提交 patch（兼容 [mini-swe-agent](https://github.com/princeton-nlp/mini-swe-agent) 流程）

## 两种模式对比

| 维度 | Oracle 单轮模式 | Agentic 多轮模式 |
|------|----------------|------------------|
| 输入信息 | `problem_statement` + 预先检索的代码上下文 | 仅 `problem_statement` |
| 上下文获取方式 | 由 `inference_dataset_id` 预先注入（oracle / BM25） | 模型自主在容器内 `bash` 探索 `/testbed` |
| 模型交互 | 单轮请求，直接输出 patch | 多轮 agent loop（默认上限 250 步） |
| 工具调用 | 无 | `bash` 工具，支持 `toolcall` / `backticks` 两种协议 |
| 提交机制 | 模型输出 diff 即视为提交 | 模型打印哨兵 `COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT` 后由系统抓取 `git diff` |
| Docker 使用阶段 | 仅评测阶段运行测试 | 推理 + 评测阶段都需要 |
| 评测数据集 | `swe_bench_verified` / `swe_bench_verified_mini` / `swe_bench_lite` | `swe_bench_verified_agentic` / `swe_bench_verified_mini_agentic` / `swe_bench_lite_agentic` / `swe_bench_multilingual_agentic` |
| 评测代价 | 相对低，单轮推理 | 较高，多轮推理 + 长时间容器交互 |

**适用场景**

- **Oracle 模式**：适合快速建立基线、对比不同检索策略效果，或在算力/时间有限时进行低成本试跑
- **Agentic 模式**：适合评估模型作为「软件工程 agent」的端到端能力（自主探索代码、编写补丁、迭代调试），更贴近真实开发场景

## 数据集说明

### 核心评测数据集（两种模式共用名字根）

下列数据集通过 Issue–PR 配对与单元测试验证评估模型，从全量到精选满足不同评估需求：

- **SWE-bench Verified（`swe_bench_verified`）**：从 SWE-bench 测试集中精选的 500 个人工验证样本，质量经过严格把关
- **SWE-bench Verified Mini（`swe_bench_verified_mini`）**：50 样本的轻量子集，存储需求约 5GB（vs 原版 130GB），保持与原集相同的难度分布
- **SWE-bench Lite（`swe_bench_lite`）**：来自 11 个流行 Python 项目的 300 个 Issue–PR 配对
- **SWE-bench Multilingual**：来自 42 个仓库、覆盖 9 种编程语言的 300 个精选 Issue–PR 任务。EvalScope 仅支持该数据集的 agentic 模式。

### Oracle 模式专属：推理数据集（`inference_dataset_id`）

不同检索方式格式化的 SWE-bench 版本，差异在于代码上下文的检索方式与上限：

- **`princeton-nlp/SWE-bench_oracle`**：使用 Oracle 检索（理想化检索结果，用作上限基准），**默认值**
- **`princeton-nlp/SWE-bench_bm25_13K`**：BM25 检索，代码上下文限制 13,000 tokens（cl100k_base）
- **`princeton-nlp/SWE-bench_bm25_27K`**：BM25 检索，限制 27,000 tokens
- **`princeton-nlp/SWE-bench_bm25_40K`**：BM25 检索，限制 40,000 tokens

### Agentic 模式专属：评测数据集

在核心数据集名字后加 `_agentic` 后缀触发 agentic 多轮评测：

- **`swe_bench_verified_agentic`** — SWE-bench Verified（500 样本）
- **`swe_bench_verified_mini_agentic`** — SWE-bench Verified Mini（50 样本，约 5GB）
- **`swe_bench_lite_agentic`** — SWE-bench Lite（300 样本）
- **`swe_bench_multilingual_agentic`** — SWE-bench Multilingual（覆盖 9 种编程语言的 300 个样本）

## 安装依赖

SWE-bench 使用 Docker 来确保评估的可复现性。

1. **安装 Docker**：参考 [Docker 安装指南](https://docs.docker.com/engine/install/) 在你的机器上安装 Docker
2. **Linux 用户额外配置**：建议查看 [安装后配置步骤](https://docs.docker.com/engine/install/linux-postinstall/) 以获得更好的体验
3. 安装 Python 依赖：

```bash
pip install evalscope
pip install swebench==4.1.0
```

**提示**：正确配置 Docker 是运行 SWE-bench 评估的前提条件，请确保安装完成后 Docker 服务正常运行。

```{note}
首次运行 swe_bench 任务时，系统需要构建/下载必要的 Docker 镜像，资源消耗较高：

- **时间消耗**：完整 SWE-bench Verified 数据集的镜像构建可能耗时数小时
- **存储需求**：完整集需预留约 130GB 存储；Mini 集约 5GB

**建议**：首次运行请确保磁盘空间和时间预算充足，并选择网络状况良好的环境。
```

## Oracle 单轮评测模式

下面以 `qwen-plus` 模型评测 `swe_bench_verified` 为例：

```python
import os
from evalscope import TaskConfig, run_task

task_cfg = TaskConfig(
    model='qwen-plus',
    api_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    eval_type='openai_api',  # 使用 API 模型服务
    datasets=['swe_bench_verified'],  # 也可选择 'swe_bench_verified_mini' 或 'swe_bench_lite'
    dataset_args={
        'swe_bench_verified': {
            'extra_params': {
                'build_docker_images': True,                              # 是否构建评测所需的 Docker 镜像，首次运行建议 True
                'pull_remote_images_if_available': True,                  # 远程有可用镜像时优先拉取，建议 True
                'inference_dataset_id': 'princeton-nlp/SWE-bench_oracle'  # 推理数据集，可选 BM25_13K / 27K / 40K / oracle
            }
        }
    },
    eval_batch_size=5,  # 推理批大小 / 并行评测任务的工作线程数（docker 容器数量）
    limit=5,            # 限制评测数量便于快速测试，正式评测时建议去掉
    generation_config={
        'temperature': 0.1,
    }
)
run_task(task_cfg=task_cfg)
```

评测中间结果保存在 `outputs/xxxxx/swebench_log` 目录下，包含 `patch.diff` 等文件。最终结果示例：

```text
+-----------+--------------------+----------+----------+-------+---------+---------+
| Model     | Dataset            | Metric   | Subset   |   Num |   Score | Cat.0   |
+===========+====================+==========+==========+=======+=========+=========+
| qwen-plus | swe_bench_verified | mean_acc | default  |     5 |     0.2 | default |
+-----------+--------------------+----------+----------+-------+---------+---------+
```

## Agentic 多轮评测模式

在 agentic 模式下，模型只接收原始 `problem_statement`（不提供 oracle 上下文），并在每个实例独立的 SWE-bench Docker 容器中驱动多轮 agent 循环：使用 `bash` 探索 `/testbed`、编辑源文件，最终通过打印哨兵字符串 `COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT` 提交 `git diff`。

### 动作协议

`action_protocol` 参数控制模型与 bash 的交互方式：

| 协议 | 描述 | 适用模型 |
|------|------|----------|
| `toolcall`（默认） | OpenAI function-calling，注册单个 `bash` 工具，支持并行工具调用 | 支持 function-calling 的模型 |
| `backticks` | 模型将命令包裹在 `` ```mswea_bash_command ... ``` `` 围栏块中，每轮一条命令 | 不支持 function-calling 的模型 |

### 运行示例

下面示例完全对齐 [tests/benchmark/test_agent.py](https://github.com/modelscope/evalscope/blob/main/tests/benchmark/test_agent.py) 中的 `test_swe_bench_verified_mini_agentic` 用例：

```python
import os
from evalscope import TaskConfig, run_task

task_cfg = TaskConfig(
    model='qwen3-max',
    api_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    eval_type='openai_api',
    datasets=['swe_bench_verified_mini_agentic'],  # 也可选 'swe_bench_verified_agentic'、'swe_bench_lite_agentic' 或 'swe_bench_multilingual_agentic'
    dataset_args={
        'swe_bench_verified_mini_agentic': {
            'extra_params': {
                'action_protocol': 'toolcall',           # 动作协议：'toolcall' 或 'backticks'
                'max_steps': 250,                        # agent 循环最大步数
                'command_timeout': 60.0,                 # 单条 bash 命令的超时（秒）
                'build_docker_images': True,             # 准备评测所需镜像，首次运行建议 True
                'pull_remote_images_if_available': True, # 远程有可用镜像时优先拉取
                # 'force_arch': 'arm64',                 # Apple Silicon 用户可显式指定为 'arm64'，默认 '' 自动检测
            }
        }
    },
    eval_batch_size=5,  # 并行容器数量
    limit=3,            # 限制评测数量便于快速测试，正式评测时建议去掉
    generation_config={
        'temperature': 0.7,
        'parallel_tool_calls': True,
        'stream': True,
    }
)
run_task(task_cfg=task_cfg)
```

### 参数说明

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `action_protocol` | str | `toolcall` | 模型与 bash 的交互协议，可选 `toolcall` / `backticks` |
| `max_steps` | int | `250` | 每个样本 agent 循环的最大步数 |
| `command_timeout` | float | `60.0` | 单条 bash 命令超时秒数 |
| `build_docker_images` | bool | `True` | 是否准备 Docker 镜像（构建或拉取） |
| `pull_remote_images_if_available` | bool | `True` | 是否优先从远程仓库拉取已构建好的镜像 |
| `force_arch` | str | `''` | 强制指定镜像架构，可选 `''` / `arm64` / `x86_64`，留空自动检测 |

```{note}
Agentic 模式在**推理和评测两个阶段**都需要 Docker 运行。每个样本会从预构建的 SWE-bench 镜像启动独立容器，因此 `eval_batch_size` 实际上控制了同时存在的容器数量，请根据机器资源酌情调整。
```
